home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Magazin / Future-PD / FinalExistence_Doom.Bak / FinalExistence_Doom.amosSourceCode
AMOS Source Code  |  1998-06-30  |  99KB  |  3,777 lines

  1. '***************************************************************************** 
  2. 'The Chrono Trigger Wanna-Be Engine
  3. 'By John C. Bintz of Internext Software
  4. 'Revision One Zillion+ 
  5. 'Version 1.0h
  6. 'Copyright ï¿½ 1998 John C. Bintz.  All Rights Reserved.  Death to Microsoft.
  7. '
  8. 'This is, in no way whatsoever, connected with Squaresoft of Japan at all. 
  9. 'This RPG engine behaves in a way like my favorite role playing game engine
  10. 'so I'm paying hommage to its parent.  I'm not trying to suck money from 
  11. 'them, nor am I trying to infringe upon anything.  Don't sic the lawyers on me 
  12. 'guys.  I'm just trying to make the Amiga world a better place.
  13. '
  14. 'This puppy has taken probably around three hundred hours of coding, revising, 
  15. 'recoding, rerevising, and testing, and it STILL isn't done!   What I need is
  16. 'a way to draw on the screen.  Plus a team of fifty to write all my games
  17. 'for me.  8^)
  18. '
  19. 'But, now, with the FULLY INTEGRATED EDITOR (well, it just does it all...),  
  20. 'RPG creation will be a slice of pie, er, piece of cake. 
  21. '
  22. 'The Force will be with you, Amy.  Always.  And pray for a PPC Amos someday! 
  23. '***************************************************************************** 
  24.  
  25. 'Revision List 
  26. '============= 
  27. 'Version 1.0b to 1.0c
  28. '--------------------
  29. '* Added Pointer (AKA Squaresoft!) 
  30. '* Caching of Bob Images (VERY fast level loading!)
  31. '* Fixed MAX_ENEMY Bug 
  32. '* Fixed Fight Command Bug 
  33. '* Changed Text Screens From Separate Screen to Overlay (neat!)
  34. '* Other Stuff That I Forget I Did (but I'm sure it was important!)  
  35. '====================  
  36. 'Version 1.0c to 1.0d
  37. '--------------------
  38. '* Added the absolutely BUFF editor with Hypertexted Help document 
  39. '* Hacked MusiCRAFT so I could have GOOD sound 
  40. '* Added the SOUND operative so you can sync SOUND EFFECTS 
  41. '* CAPITALIZED a couple of things
  42. '====================
  43. 'Version 1.0d to 1.0e
  44. '--------------------
  45. '* Updated editor for faster speed and more intuitive use
  46. '* Fixed Frame Displaying, which skipped the first frame on FRAMEANIMs 
  47. '* Made certain commands multithreading for maximum speed! 
  48. '* Trimmed some arrays for memory saving 
  49. '* Allowed for smoother KILLing of objects before level loads
  50. '====================
  51. 'Version 1.0e to 1.0f
  52. '--------------------
  53. '* No more loading Amos to find level problems!  Error window displays 
  54. '  problem on Workbench Screen 
  55. '====================
  56. 'Version 1.0f to 1.0g
  57. '--------------------
  58. '* Small optimizations here and there... 
  59. '* Added QUAKE operative (which I ain't afraid of, of course!) 
  60. '* Allowed more than 255 bobs in an SBOBS bank (had to rewrite the entire
  61. '  frames routine, though...and on my second day off from school, too!)
  62. '* Never use the Trap instruction, especially on a function!  It thrashes
  63. '  Chip memory, which is always bad!  Just be sure your character really 
  64. '  exists when you use the COORDS command. 
  65. '* Changed the FIGHT routine.  Now, enemies are gauged in actual HP, ATK,
  66. '  DEF, and CHARGE.  Plus, there is also a Hit % calc that says you can
  67. '  still hit a guy, no matter what strength you are, and still cause damage. 
  68. '* Removed defunct "How this works" code...as I know how it works!  I wrote
  69. '  it, remember?  Saved a few K in source code.
  70. '====================
  71. 'Version 1.0g to 1.0h
  72. '--------------------
  73. '* DOOM Music Extension!  I think I might make the game 020 only, but I might
  74. '  also stick in the old Amos routines to make an 000 version.  PT Mods play 
  75. '  back PERFECTLY, with tempo and all!  SFX also don't kill the system.
  76. '* Forced Game Saving routine to stick '.game' onto end of game titles 
  77. '  without the extension 
  78. '* Prevented player from moving when screen is blank.  Thanks, Justin! 
  79. '* Becky found a nasty bug that involved Global Variables and Item Lists 
  80. '  not to be erased when a new game was started.  A Level 4 MXL in the 
  81. '  beginning of the game!  Wow!
  82. '* Tweaked Battle stuff a little bit.  Almost done...
  83. '* Fixed nasty 'Out Of Memory' error upon loading screens
  84.  
  85. Set Buffer 20
  86. Amos To Back 
  87. CMND$=Command Line$
  88. Screen Open 0,320,200,2,Lowres : Cls 0
  89. Palette $0,$FFF
  90. Degree 
  91. Randomize Timer
  92. Hide On 
  93. Led Off 
  94.  
  95. A$="$VER: Final_Existence_1.0h"
  96.  
  97. Erase 1 : Erase 12 : Extension_15_0376 : Erase 33
  98.  
  99. Close Editor 
  100. Close Workbench 
  101.  
  102. Assign "rpg:" To Dir$
  103.  
  104. Dim SCRVARNAME$(63),SCRPAUSE(255)
  105. Dim PARSE$(9),PV(9),IV(9),DISPLAY$(3),DISPLAY_JUMP$(3)
  106. Dim ITEMS$(255),ITEMHAVE(261),SCOMPILE$(99)
  107. Dim RATINGS(6),CHAR_FRAMEBASE(63)
  108. Dim CHAR_MOVEDIFF(63,1),CHAR_CANCOLLIDE(63)
  109. Dim TCH(63),CHAR_ANIMFRAME(63)
  110. Dim FRAME_DIDCHANGE(63)
  111.  
  112. Dim SCRIPT_CURRCOMMAND(63,3)
  113.  
  114. Dim FIGHT_ENEMIES(15),FIGHT_HP(15),FIGHT_POWER(15)
  115. Dim FIGHT_RESPONSE(16),FIGHT_CHARGE(16),FIGHT_ATTACK(15)
  116. Dim FIGHT_DEFENSE(15)
  117.  
  118. Dim ZNE_TYPE(255),MENU_VAR(9)
  119.  
  120. Dim EFFECT_SETTINGS(9),EFFECT_COLORS(9,9)
  121.  
  122. Dim NEWMENU$(9,1),NEWMENU_POS(9,1),MENU_COLORS(3)
  123.  
  124. Reserve As Work 45,64
  125.  
  126. Global SCRVARNAME$(),SCRPAUSE()
  127. Global PARSE$(),PV(),IV(),DISPLAY$(),DISPLAY_JUMP$()
  128. Global ITEMS$(),ITEMHAVE(),RATINGS(),CHAR_FRAMEBASE()
  129. Global CHAR_MOVEDIFF(),CHAR_CANCOLLIDE(),SCOMPILE$()
  130. Global TCH(),CHAR_ANIMFRAME(),FRAME_DIDCHANGE()
  131.  
  132. Global SCRIPT_CURRCOMMAND()
  133.  
  134. Global FIGHT_ENEMIES(),FIGHT_HP(),FIGHT_POWER(),FIGHT_RESPONSE()
  135. Global FIGHT_CHARGE(),FIGHT_ATTACK(),FIGHT_DEFENSE()
  136.  
  137. Global ZNE_TYPE(),MENU_VAR()
  138.  
  139. Global EFFECT_SETTINGS(),EFFECT_COLORS()
  140.  
  141. Global NEWMENU$(),NEWMENU_POS(),MENU_COLORS()
  142.  
  143. Global SCR_START,SCR_END,SCR_EOF,SCR_PARSE,SCR_CURR
  144. Global DAT_VARS,DAT_SCR,SCR_LEN,SCR_POS,SCR_MAX,SCR_BEGINHERE
  145. Global TXT_GRAB,TXT_POS,DISP_OPTION,DISP_GO
  146. Global DISP_ISOPEN,DISP_SWAP,ENEMY_MAX,IMDEAD
  147.  
  148. Global LEVEL_LOADNOW$,LEVEL_SKIPCHARXY,CHAR_NAME$,FRAMES_FILE$
  149. Global FRAMES_LOAD$
  150.  
  151. Global WALK_DELAY,OFFSET_CHANGE,ZNE_CHECKED
  152.  
  153. Global CHAR_XPOS,CHAR_YPOS,NOFRONTFADE,BLACKSCREEN
  154. Global MAP_WIDTH,MAP_HEIGHT,MAP_XPOS,MAP_YPOS
  155.  
  156. Global SSVTIMER,DISPLAY_SHOW,CURRMOD$,CURRLEVEL$
  157. Global CONTROLLOCK,FRAME_PTR,VB_LINE,WALKTHRUWALLS
  158.  
  159. 'Global _X1,_Y1,_X2,_Y2,_WHICH,PTR,A 
  160.  
  161. VB_LINE=250
  162.  
  163. EFFECT_COLORS(0,0)=2
  164. EFFECT_COLORS(0,1)=11
  165. EFFECT_COLORS(0,2)=12
  166.  
  167. EFFECT_COLORS(1,0)=31
  168. EFFECT_COLORS(1,1)=30
  169. EFFECT_COLORS(1,2)=29
  170.  
  171. MUS_NOPLAY=(Instr(Upper$(CMND$),"NOMUSIC")>0)
  172. CDROM=Exist("FE_FMV.iff")
  173.  
  174. ERR_FILE$="RPG:CTW_Error.abk"
  175. On Error Proc INEXT_ERRORTRAP
  176.  
  177. Amos To Front 
  178. Amos Lock 
  179.  
  180. 'Test New Code Here
  181.  
  182. 'Setup 
  183.  
  184. NEWFRAME_SETUP
  185. ITEM_PREP
  186. GLOVAR_PREP
  187. SCOMPILE_SETUP
  188.  
  189. 'Intro Animation 
  190.  
  191. Load "InextIntro.abk",255
  192. S=Start(255)
  193. S=Frame Play(S,1,7)
  194. Double Buffer : Autoback 0
  195. T=Timer+2
  196. Repeat 
  197.   Repeat : Until Timer>T
  198.   OS=S
  199.   S=Frame Play(S,1,7)
  200.   If S<>OS
  201.     Screen Swap : T=Timer+2
  202.   End If 
  203. Until S=OS
  204. T=Timer+30 : Repeat : Until Timer>T
  205. Fade 2 : T=Timer+30 : Repeat : Until Timer>T
  206. Screen Close 7
  207. Erase 255
  208.  
  209. If CDROM
  210.   FMV["FE_FMV.iff"]
  211. End If 
  212.  
  213. BACKTOINTRO:
  214. GLOVAR_PREP
  215. For I=0 To 261 : ITEMHAVE(I)=0 : Next 
  216. Screen Open 0,320,200,2,Lowres : Cls 0
  217. Palette $0,$FFF
  218. CHAR_NAME$="Mike"
  219. ZNEJUMP_LEAVE=-1
  220. IMDEAD=False
  221.  
  222. RATING_SET["HP",50]
  223. RATING_SET["MHP",50]
  224. RATING_SET["STR",5]
  225. RATING_SET["DEX",5]
  226. RATING_SET["INT",5]
  227. RATING_SET["CRED",50]
  228.  
  229. FULLINTRO
  230. WHICH=Param
  231.  
  232. If WHICH=0
  233.   If Key State(20)
  234.     Clear Key 
  235.     Print "Variable Space Free:";Free
  236.     Line Input "Name Of Level To Load:";LVL$
  237.     LEVEL_LOAD[LVL$]
  238.   Else 
  239.     LEVEL_LOAD["level1.level"]
  240.   End If 
  241. Else If WHICH=1
  242.   Show On 
  243.   FILE$=Fsel$("*.game","","Choose a Saved Game File")
  244.   Hide On 
  245.   DIDLOAD=False
  246.   If FILE$<>"" : If Exist(FILE$)
  247.       DIDLOAD=True
  248.       GAME_LOAD[FILE$]
  249.   End If : End If 
  250.   If DIDLOAD=False : Goto BACKTOINTRO : End If 
  251. Else If WHICH=2
  252.   If CDROM
  253.     FMV["FE_FMV.iff"]
  254.   Else 
  255.     Load "CDROMOnly.spk",512
  256.     Unpack 512 To 6 : Screen Hide 6
  257.     Screen Open 7,320,200,4096,Lowres : Flash Off : Curs Off : Cls 0
  258.     Get Palette 6
  259.     For I=0 To 99
  260.       Screen Copy 6,0,I*2,320,(I*2)+1 To 7,0,I*2
  261.       Screen Copy 6,0,199-(I*2),320,200-(I*2) To 7,0,199-(I*2)
  262.       If(I and 3)=0 : Wait Vbl : End If 
  263.     Next 
  264.     Screen Close 6
  265.     T=Timer+200
  266.     Repeat : Until Timer>T or Fire(1)
  267.     Screen 7
  268.     For I=0 To 99
  269.       Cls 0,0,I*2 To 320,(I*2)+1
  270.       Cls 0,0,199-(I*2) To 320,200-(I*2)
  271.       If(I and 3)=0 : Wait Vbl : End If 
  272.     Next 
  273.     Screen Close 7
  274.   End If 
  275.   Goto BACKTOINTRO
  276. Else If WHICH=3
  277.   Erase 1 : Extension_15_0376 : Erase 33
  278.   Amos Unlock 
  279.   Edit 
  280. End If 
  281.  
  282. Do 
  283.   If TXT_GRAB=-1
  284.     If Key State(68)
  285.       NEWMENU_ROUTINE
  286.     End If 
  287.     If Key State(16)
  288.       Screen 2 : Fade 2
  289.       For I=63 To 0 Step -4
  290.          Extension_15_03B0 I : Wait Vbl 
  291.       Next 
  292.       Wait 14 : Extension_15_0376 : Erase 33
  293.       CURRMOD$=""
  294.       Goto BACKTOINTRO
  295.     End If 
  296.     SNAPSHOT
  297.     If Not CONTROLLOCK : If Not BLACKSCREEN
  298.       If Timer>WALK_DELAY
  299.         OXPOS=CHAR_XPOS : OYPOS=CHAR_YPOS
  300.         If Joy(1)>0
  301.           A=-1
  302.           If Jleft(1)
  303.             CHAR_XPOS=CHAR_XPOS-4
  304.             If CHAR_XPOS<0 : CHAR_XPOS=0 : End If 
  305.           End If 
  306.           If Jright(1)
  307.             CHAR_XPOS=CHAR_XPOS+4
  308.             If CHAR_XPOS>MAP_WIDTH : CHAR_XPOS=MAP_WIDTH : End If 
  309.           End If 
  310.           
  311.           If CHAR_XPOS<>OXPOS
  312.             MAP_ZONECHECK[CHAR_XPOS,CHAR_YPOS] : A=Param
  313.             If A=0 : CHAR_XPOS=OXPOS : End If 
  314.             If A=1 : WALK_DELAY=Timer+10 : End If 
  315.             If A=2
  316.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : B=Param
  317.               MAP_ZONEGETVAR[ZNE_CHECKED,1] : CHAR_XPOS=Param
  318.               MAP_ZONEGETVAR[ZNE_CHECKED,2] : CHAR_YPOS=Param
  319.               LEVEL_LOADNOW$="level"+(Str$(B)-" ")+".level"
  320.               LEVEL_SKIPCHARXY=((CHAR_XPOS>-1) and(CHAR_YPOS>-1))
  321.             End If 
  322.             If A=3
  323.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : GROUP=Param
  324.               FIGHT_SETUP[GROUP]
  325.             End If 
  326.             If A=4
  327.               If ZNEJUMP_LEAVE=-1
  328.                 MAP_ZONEGETVAR[ZNE_CHECKED,0] : CHAR=Param
  329.                 MAP_ZONEGETVAR[ZNE_CHECKED,1] : LBL=Param
  330.                 SCRIPT_JUMP[CHAR,"ZONELABEL"+(Str$(LBL)-" ")]
  331.                 ZNEJUMP_LEAVE=ZNEJUMP_CHECKED
  332.               End If 
  333.             End If 
  334.             If ZNEJUMP_LEAVE<>ZNE_CHECKED : ZNEJUMP_LEAVE=-1 : End If 
  335.             
  336.             CHAR_COLLIDE[6]
  337.             If Param>-1
  338.               CHAR_YPOS=OYPOS : SCR=Param
  339.               If CHAR_CANCOLLIDE(SCR)
  340.                 SCRIPT_JUMP[SCR,"COLLIDE"]
  341.               End If 
  342.             End If 
  343.           End If 
  344.           
  345.           If A=2 : Goto QUICKJUMP : End If 
  346.           
  347.           If Jup(1)
  348.             CHAR_YPOS=CHAR_YPOS-4
  349.             If CHAR_YPOS<0 : CHAR_YPOS=0 : End If 
  350.           End If 
  351.           If Jdown(1)
  352.             CHAR_YPOS=CHAR_YPOS+4
  353.             If CHAR_YPOS>MAP_HEIGHT : CHAR_YPOS=MAP_HEIGHT : End If 
  354.           End If 
  355.           
  356.           If CHAR_YPOS<>OYPOS
  357.             MAP_ZONECHECK[CHAR_XPOS,CHAR_YPOS] : A=Param
  358.             If A=0 : CHAR_YPOS=OYPOS : End If 
  359.             If A=1 : WALK_DELAY=Timer+10 : End If 
  360.             If A=2
  361.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : B=Param
  362.               MAP_ZONEGETVAR[ZNE_CHECKED,1] : CHAR_XPOS=Param
  363.               MAP_ZONEGETVAR[ZNE_CHECKED,2] : CHAR_YPOS=Param
  364.               LEVEL_LOADNOW$="level"+(Str$(B)-" ")+".level"
  365.               LEVEL_SKIPCHARXY=((CHAR_XPOS>-1) and(CHAR_YPOS>-1))
  366.             End If 
  367.             If A=3
  368.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : GROUP=Param
  369.               FIGHT_SETUP[GROUP]
  370.             End If 
  371.             If A=4
  372.               If ZNEJUMP_LEAVE=-1
  373.                 MAP_ZONEGETVAR[ZNE_CHECKED,0] : CHAR=Param
  374.                 MAP_ZONEGETVAR[ZNE_CHECKED,1] : LBL=Param
  375.                 SCRIPT_JUMP[CHAR,"ZONELABEL"+(Str$(LBL)-" ")]
  376.                 ZNEJUMP_LEAVE=ZNE_CHECKED
  377.               End If 
  378.             End If 
  379.             If ZNEJUMP_LEAVE<>ZNE_CHECKED : ZNEJUMP_LEAVE=-1 : End If 
  380.             
  381.             CHAR_COLLIDE[6]
  382.             If Param>-1
  383.               CHAR_YPOS=OYPOS : SCR=Param
  384.               If CHAR_CANCOLLIDE(SCR)
  385.                 SCRIPT_JUMP[SCR,"COLLIDE"]
  386.               End If 
  387.             End If 
  388.           End If 
  389.           
  390.           If Fire(1)
  391.             CHAR_COLLIDE[Deek(Sprite Base(I Bob(0) and $3FFF)+2)]
  392.             If Param>-1
  393.               W=Param
  394.               CHAR_FACE[0,W]
  395.               SCRIPT_JUMP[W,"TOUCH"]
  396.             End If 
  397.           End If 
  398.           
  399.           QUICKJUMP:
  400.           
  401.           CHAR_MOVEDIFF[0]
  402.           NEWFRAME_LOOP[0,False]
  403.         End If 
  404.       End If : End If 
  405.     End If 
  406.   End If 
  407.   
  408.   SCRIPT_NEXTCMND
  409.   If IMDEAD
  410.     Screen 2 : Fade 2
  411.     CURRMOD$=""
  412.     For I=63 To 0 Step -4
  413.        Extension_15_03B0 I : Wait Vbl 
  414.     Next 
  415.     Wait 14 : Extension_15_0376 : Erase 33
  416.     Goto BACKTOINTRO
  417.   End If 
  418.   LEVEL_CHECK
  419.   If CONTROLLOCK
  420.     CHAR_XPOS=X Bob(0)
  421.     CHAR_YPOS=Y Bob(0)
  422.     SCRNSAVER_KILL
  423.   End If 
  424.   Bob 0,CHAR_XPOS,CHAR_YPOS,
  425.   MAP_DISPLAY
  426.   SCRNSAVER
  427. Loop 
  428.  
  429. Procedure CHAR_MOVEDIFF[WHICH]
  430.   On Error Proc INEXT_ERRORTRAP
  431.   DX=X Bob(WHICH)-CHAR_MOVEDIFF(WHICH,0)
  432.   DY=Y Bob(WHICH)-CHAR_MOVEDIFF(WHICH,1)
  433.   If DX<>0 or DY<>0
  434.     NEWFRAME_CURRFRAMESET[WHICH] : CF=Param
  435.     If Abs(DX)>Abs(DY)
  436.       If DX>0 : NF=2
  437.     Else : NF=3 : End If 
  438.     Else 
  439.       If DY>0 : NF=0
  440.     Else : NF=1 : End If 
  441.     End If 
  442.     NF=NF+CHAR_FRAMEBASE(WHICH)
  443.     If NF<>CF
  444.       NEWFRAME_SET[WHICH,NF,False]
  445.     End If 
  446.     CHAR_MOVEDIFF(WHICH,0)=X Bob(WHICH)
  447.     CHAR_MOVEDIFF(WHICH,1)=Y Bob(WHICH)
  448.   End If 
  449. End Proc
  450.  
  451. Procedure SCRIPT_PREP
  452.   On Error Proc INEXT_ERRORTRAP
  453.   SCR_MAX=-1 : TXT_GRAB=-1 : SCR_CURR=0
  454.   Erase 69 : Erase 70
  455.   Reserve As Work 68,65536 : Rem Variables
  456.   Reserve As Work 67,5120 : Rem Scripts and Groups 
  457.   
  458.   DAT_VARS=Start(68) : DAT_SCR=Start(67)
  459. End Proc
  460. Procedure SCRIPT_SKIP
  461.   On Error Proc INEXT_ERRORTRAP
  462.   Loke DAT_SCR+(SCR_CURR*12),0
  463.   Loke DAT_SCR+(SCR_CURR*12)+4,0
  464.   Inc SCR_CURR : Inc SCR_MAX
  465. End Proc
  466. Procedure SCRIPT_LOAD[FILE$]
  467.   On Error Proc INEXT_ERRORTRAP
  468.   If Not Exist(FILE$)
  469.     INEXT_ERROR["Cannot Find .script File","",FILE$]
  470.   End If 
  471.   Open In 1,FILE$
  472.   Reserve As Work 69,Lof(1)
  473.   Sload 1 To 69,Lof(1)
  474.   Close 1
  475.   SCR_START=Start(69) : SCR_END=Start(69)+Length(69)-1
  476.    Extension_10_028A 0,31,32,Start(69) To SCR_END
  477.   
  478.   Reserve As Work 71,Length(69)
  479.   
  480.   PTR=Start(69) : CURRVAR=0 : MPTR=Start(71)
  481.   CHAR_CANCOLLIDE(SCR_CURR)=False
  482.   SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1
  483.   SCRPAUSE(SCR_CURR)=0
  484.   CHAR_ANIMFRAME(SCR_CURR)=False
  485.   Repeat 
  486.     SCRIPT_GETCMND[PTR] : PTR=Param
  487.     
  488.     If Not SCR_EOF
  489.       SP$=""
  490.       For I=0 To SCR_PARSE
  491.         If Asc(PARSE$(I))=64
  492.           A=-1
  493.           For J=0 To CURRVAR
  494.             If SCRVARNAME$(J)=PARSE$(I)
  495.               A=J : J=255
  496.             End If 
  497.           Next 
  498.           If A>-1
  499.             PARSE$(I)=Str$(A)-" "
  500.           Else 
  501.             SCRVARNAME$(CURRVAR)=PARSE$(I)
  502.             PARSE$(I)=Str$(CURRVAR)-" "
  503.             Inc CURRVAR
  504.           End If 
  505.           PARSE$(I)="@"+PARSE$(I)
  506.         End If 
  507.         If I=0
  508.           For J=0 To 99
  509.             If SCOMPILE$(J)=PARSE$(0)
  510.               PARSE$(0)=Chr$(J+69) : J=99
  511.             End If 
  512.           Next 
  513.         End If 
  514.         If I=SCR_PARSE
  515.           PARSE$(I)=PARSE$(I)+"|"
  516.         Else 
  517.           PARSE$(I)=PARSE$(I)+" "
  518.         End If 
  519.         SP$=SP$+PARSE$(I)
  520.       Next 
  521.        Extension_10_0084 SP$,MPTR
  522.       MPTR=MPTR+Len(SP$)
  523.       If Upper$(PARSE$(0))=":COLLIDE|"
  524.         CHAR_CANCOLLIDE(SCR_CURR)=True
  525.       End If 
  526.     End If 
  527.   Until SCR_EOF
  528.   For I=0 To CURRVAR
  529.     SCRVARNAME$(I)=""
  530.   Next 
  531.   
  532.   TCH(SCR_CURR)=False
  533.   
  534.   SCR_EOF=False
  535.   Bank Shrink 71 To MPTR-Start(71)
  536.   SCR_LEN=Length(71)
  537.   
  538.   If Length(70)=0
  539.     Reserve As Work 70,Length(71)
  540.     Copy Start(71),Start(71)+Length(71) To Start(70)
  541.     SCR_POS=0
  542.   Else 
  543.     SCR_POS=Length(70)
  544.     Reserve As Work 72,Length(70)+Length(71)
  545.     Copy Start(70),Start(70)+Length(70) To Start(72)
  546.     Copy Start(71),Start(71)+Length(71) To Start(72)+Length(70)
  547.     Bank Swap 72,70 : Erase 72
  548.   End If 
  549.   SCR_BEGINHERE=Start(70)
  550.   
  551.   D=SCR_CURR*12
  552.   Loke DAT_SCR+D,SCR_POS
  553.   Loke DAT_SCR+D+4,SCR_LEN
  554.   Loke DAT_SCR+D+8,0
  555.   Erase 71 : Inc SCR_CURR : Inc SCR_MAX
  556. End Proc
  557. Procedure SCOMPILE_SETUP
  558.   On Error Proc INEXT_ERRORTRAP
  559.   Open In 1,"CompileList.txt"
  560.   Set Input 10,-1
  561.   Repeat 
  562.     Line Input #1,A$
  563.     If Extension_10_0512(A$)=2
  564.       SCOMPILE$(Val( Extension_10_0520(1,A$)))=Upper$( Extension_10_0520(2,A$))
  565.     End If 
  566.   Until Eof(1)
  567.   Close 1
  568. End Proc
  569.  
  570. Procedure SNAPSHOT
  571.   If Key State(89)
  572.     S=Screen : Screen 2
  573.     A$=Fsel$("*.iff","","Enter a name for the Snapshot")
  574.     If A$<>"" : Save Iff A$ : End If 
  575.     Screen S
  576.   End If 
  577. End Proc
  578.  
  579. Procedure SCRIPT_GROUP[V,S]
  580.   On Error Proc INEXT_ERRORTRAP
  581.   Loke DAT_SCR+3072+(SCR_CURR*4),V
  582.   Loke DAT_SCR+4096+(SCR_CURR*4),S
  583. End Proc
  584.  
  585. Procedure SCRIPT_GETGROUP[NUM]
  586.   On Error Proc INEXT_ERRORTRAP
  587.   ENEMY_MAX=-1
  588.   For I=1 To SCR_MAX
  589.     If Leek(DAT_SCR+3072+I*4)=NUM
  590.       If X Bob(I)>-50 and Y Bob(I)>-50
  591.         Inc ENEMY_MAX
  592.         FIGHT_ENEMIES(ENEMY_MAX)=I
  593.         FIGHT_POWER(ENEMY_MAX)=Leek(DAT_SCR+4096+I*4)
  594.       End If 
  595.     End If 
  596.   Next 
  597. End Proc
  598. Procedure SCRIPT_SCRGROUP[WHICH]
  599.   On Error Proc INEXT_ERRORTRAP
  600. End Proc[Leek(DAT_SCR+3072+WHICH*4)]
  601.  
  602. Procedure CHAR_SET[FILE$,X,Y,F,V,S]
  603.   'On Error Proc INEXT_ERRORTRAP 
  604.   SCRIPT_GROUP[V,S]
  605.   NEWFRAME_SET[SCR_CURR,F,False]
  606.   For I=0 To 3
  607.     NEWFRAME_GRABSET[F+I]
  608.   Next 
  609.   CHAR_FRAMEBASE(SCR_CURR)=F
  610.   Bob SCR_CURR,X,Y,
  611.   CHAR_MOVEDIFF(SCR_CURR,0)=X
  612.   CHAR_MOVEDIFF(SCR_CURR,1)=Y
  613.   SCRIPT_LOAD[FILE$]
  614. End Proc
  615.  
  616. Procedure SCRIPT_NEXTCMND
  617.   'On Error Proc INEXT_ERRORTRAP 
  618.   Shared MUS_NOPLAY
  619.   If DISP_ISOPEN and DISP_GO
  620.     DISPLAY_WAIT
  621.   Else 
  622.      Extension_5_003A 
  623.     For SCR_CURR=0 To SCR_MAX
  624.       If X Bob(SCR_CURR)>-50 and Y Bob(SCR_CURR)>-50
  625.         If Timer>SCRPAUSE(SCR_CURR)
  626.           If CHAR_ANIMFRAME(SCR_CURR)
  627.             NEWFRAME_MOVE[SCR_CURR,False]
  628.             CHAR_ANIMFRAME(SCR_CURR)= Not Param
  629.             If Not CHAR_ANIMFRAME(SCR_CURR)
  630.               NEWFRAME_CHANGE[SCR_CURR]
  631.               If Not Param
  632.                 CHAR_MOVEDIFF[SCR_CURR]
  633.               End If 
  634.             End If 
  635.           Else 
  636.             If SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1
  637.               SC=SCR_CURR*12
  638.               SCR_START=SCR_BEGINHERE+Leek(DAT_SCR+SC)
  639.               SCR_END=SCR_START+Leek(DAT_SCR+SC+4)
  640.               
  641.               If SCR_START<>SCR_END
  642.                 PTR=SCR_START+Leek(DAT_SCR+SC+8)
  643.                 OPTR=PTR
  644.                 
  645.                 A=Hunt(PTR To SCR_END,"|")
  646.                 If A=0
  647.                   SCR_EOF=True
  648.                   Goto __STOPSCR
  649.                 Else 
  650.                   SCR_EOF=False
  651.                   A$= Extension_10_007A(PTR,A-PTR) : A=A+1
  652.                   SCR_PARSE= Extension_10_0512(A$)
  653.                   For I=1 To SCR_PARSE
  654.                     PARSE$(I-1)= Extension_10_0520(I,A$)
  655.                   Next 
  656.                   SCR_PARSE=SCR_PARSE-1
  657.                 End If 
  658.                 __STOPSCR:
  659.                 
  660.                 If Not SCR_EOF
  661.                   PTR=A
  662.                   C=-1
  663.                   If Len(PARSE$(0))=1
  664.                     C=Asc(PARSE$(0))-69
  665.                   End If 
  666.                   SCRIPT_CURRCOMMAND(SCR_CURR,0)=C
  667.                   SCRIPT_CURRCOMMAND(SCR_CURR,1)=-1
  668.                   
  669.                   FRAME_DIDCHANGE(SCR_CURR)=False
  670.                   
  671.                   If SCR_PARSE>0
  672.                     XYZ=SCR_CURR*256
  673.                     For I=1 To SCR_PARSE
  674.                       If Asc(PARSE$(I))=64
  675.                         IV(I)=Val(Mid$(PARSE$(I),2))
  676.                         PV(I)=Leek(DAT_VARS+XYZ+IV(I)*4)
  677.                       Else 
  678.                         PV(I)=Val(PARSE$(I))
  679.                         IV(I)=-1
  680.                       End If 
  681.                     Next 
  682.                   End If 
  683.                   If TXT_GRAB=SCR_CURR
  684.                     If(C<>50 and C<>51)
  685.                       If TXT_POS>0
  686.                         DISP_GO=True
  687.                         DISPLAY_FIGOPTIONS
  688.                         DISPLAY_TEXT
  689.                         Repeat 
  690.                           DISPLAY_WAIT
  691.                         Until Not DISP_GO
  692.                       End If 
  693.                       DISPLAY_CLOSE
  694.                       TXT_GRAB=-1 : TXT_POS=0
  695.                     End If 
  696.                   End If 
  697.                 End If 
  698.               End If 
  699.             Else 
  700.               C=SCRIPT_CURRCOMMAND(SCR_CURR,0)
  701.             End If 
  702.             
  703.             OXBOB=X Bob(SCR_CURR)
  704.             OYBOB=Y Bob(SCR_CURR)
  705.             
  706.             Gosub CMNDSET1
  707.             
  708.             If TXT_GRAB=SCR_CURR
  709.               If TXT_POS=4
  710.                 DISP_GO=True
  711.                 DISPLAY_FIGOPTIONS
  712.                 DISPLAY_TEXT
  713.                 Repeat 
  714.                   DISPLAY_WAIT
  715.                 Until Not DISP_GO
  716.                 TXT_POS=0
  717.               End If 
  718.             End If 
  719.             
  720.             NEWFRAME_CHANGE[SCR_CURR]
  721.             TA= Not Param
  722.             TB= Not WALKTHRUWALLS
  723.             If TA and TB
  724.               X=X Bob(SCR_CURR) : Y=Y Bob(SCR_CURR)
  725.               MAP_ZONECHECK[X,Y] : A=Param
  726.               If A=0 : X=OXBOB : End If 
  727.               MAP_ZONECHECK[X,Y] : A=Param
  728.               If A=0 : Y=OYBOB : End If 
  729.               Bob SCR_CURR,X,Y,
  730.             End If 
  731.             If Not NOSETPOINTER
  732.               If OPTR=SCR_START+Leek(DAT_SCR+SC+8)
  733.                 Loke DAT_SCR+SC+8,PTR-SCR_START
  734.                 NOSETPOINTER=False
  735.               End If 
  736.             End If 
  737.           End If 
  738.         End If 
  739.         NEWFRAME_CHANGE[SCR_CURR] : DC=Param
  740.         If DC and Not FRAME_DIDCHANGE(SCR_CURR)
  741.           NEWFRAME_LOOP[SCR_CURR,False]
  742.         End If 
  743.       End If 
  744.     Next 
  745.     SUPERSKIP:
  746.      Extension_5_0028 
  747.   End If 
  748.   Pop Proc
  749.   CMNDSET1:
  750.   'If C$="SET" 
  751.   If C=52 : Return : End If 
  752.   If C=0
  753.     VAR_SET[IV(1),PV(2)]
  754.     'Else If C$="MATH" 
  755.   Else If C=1
  756.     O$=PARSE$(2)
  757.     If O$="+"
  758.       RES=PV(1)+PV(3)
  759.     Else If O$="-"
  760.       RES=PV(1)-PV(3)
  761.     Else If O$="*"
  762.       RES=PV(1)*PV(3)
  763.     Else If O$="/" and PV(3)<>0
  764.       RES=PV(1)/PV(3)
  765.     Else If O$="%" and PV(3)<>0
  766.       RES=PV(1) mod PV(3)
  767.     Else If O$="="
  768.       RES=(PV(1)=PV(3))
  769.     Else If O$="<"
  770.       RES=(PV(1)<PV(3))
  771.     Else If O$=">"
  772.       RES=(PV(1)>PV(3))
  773.     Else If O$="<=" or O$="=<"
  774.       RES=(PV(1)<=PV(3))
  775.     Else If O$="=>" or O$=">="
  776.       RES=(PV(1)=>PV(3))
  777.     Else If O$="<>"
  778.       RES=(PV(1)<>PV(3))
  779.     End If 
  780.     If SCR_PARSE=4
  781.       VAR_SET[IV(4),RES]
  782.     Else 
  783.       VAR_SET[IV(1),RES]
  784.     End If 
  785.     'Else If C$="PAUSE"
  786.   Else If C=2
  787.     SCRPAUSE(SCR_CURR)=Timer+PV(1)*50
  788.   Else If C=3
  789.     'Else If C$="FACE" 
  790.     A=Instr("SNEW",Upper$(PARSE$(1)))
  791.     If A=0
  792.       CHAR_MOVEDIFF(SCR_CURR,0)=X Bob(SCR_CURR)+(X Bob(SCR_CURR)-X Bob(PV(1)))
  793.       CHAR_MOVEDIFF(SCR_CURR,1)=Y Bob(SCR_CURR)+(Y Bob(SCR_CURR)-Y Bob(PV(1)))
  794.       CHAR_MOVEDIFF[SCR_CURR]
  795.     Else 
  796.       CF=CHAR_FRAMEBASE(SCR_CURR)+A-1
  797.       NEWFRAME_SET[SCR_CURR,CF,False]
  798.     End If 
  799.     'Else If C$="FRAMEANIM"
  800.   Else If C=4
  801.     CHAR_ANIMFRAME(SCR_CURR)=True
  802.     NEWFRAME_SET[SCR_CURR,PV(1),False]
  803.     NEWFRAME_RESET
  804.     NEWFRAME_GRABSET[PV(1)]
  805.     NEWFRAME_FULLREQUEST
  806.     'Else If C$="MENURESET"
  807.   Else If C=5
  808.     NEWMENU_RESET
  809.     'Else If C$="MENUADD"
  810.   Else If C=6
  811.     NEWMENU_ADD[PARSE$(1)-Chr$(34),PARSE$(2)-Chr$(34)]
  812.     'Else If C$="MENUCHOICE" 
  813.   Else If C=7
  814.     NEWMENU_CHOICE
  815.     A=Param : VAR_SET[IV(1),A]
  816.     'Else If C$="MOVE" 
  817.   Else If C=8
  818.     X=X Bob(SCR_CURR)+PV(1) : Y=Y Bob(SCR_CURR)+PV(2)
  819.     Bob SCR_CURR,X,Y,
  820.     NEWFRAME_LOOP[SCR_CURR,False]
  821.     CHAR_MOVEDIFF[SCR_CURR]
  822.   End If 
  823.   'If C$="GOTO"
  824.   If C=9
  825.     LABEL$=":"+PARSE$(1)
  826.     A=Hunt(SCR_START To SCR_END,LABEL$)
  827.     If A>0 : PTR=A+Len(LABEL$)+1 : End If 
  828.     'Else If C$="ONGOTO" 
  829.   Else If C=10
  830.     JMP=(PV(2)-PV(1))+3
  831.     If JMP=<SCR_PARSE
  832.       LABEL$=":"+PARSE$(JMP)
  833.       A=Hunt(SCR_START To SCR_END,LABEL$)
  834.       If A>0 : PTR=A+Len(LABEL$)+1 : End If 
  835.     End If 
  836.     'Else If C$="LABELJUMP"
  837.   Else If C=11
  838.     SCRIPT_JUMP[PV(1),PARSE$(2)]
  839.     NOSETPOINTER=(SCR_CURR=PV(1))
  840.     'Else If C$="TOGGLETOUCH"
  841.   Else If C=12
  842.     TCH(SCR_CURR)= Not TCH(SCR_CURR)
  843.     'Else If C$="WALK" 
  844.   Else If C=13
  845.     If SCRIPT_CURRCOMMAND(SCR_CURR,1)=-1
  846.       SCRIPT_CURRCOMMAND(SCR_CURR,1)=PV(1)
  847.       SCRIPT_CURRCOMMAND(SCR_CURR,2)=PV(2)
  848.       SCRIPT_CURRCOMMAND(SCR_CURR,3)=PV(3)
  849.     End If 
  850.     D=SCRIPT_CURRCOMMAND(SCR_CURR,1)
  851.     S=SCRIPT_CURRCOMMAND(SCR_CURR,2)
  852.     T=SCRIPT_CURRCOMMAND(SCR_CURR,3)
  853.     X=X Bob(SCR_CURR) : Y=Y Bob(SCR_CURR)
  854.     If D=0
  855.       Y=Y-S
  856.     Else If D=1
  857.       Y=Y+S
  858.     Else If D=2
  859.       X=X-S
  860.     Else If D=3
  861.       X=X+S
  862.     End If 
  863.     Bob SCR_CURR,X,Y,
  864.     NEWFRAME_LOOP[SCR_CURR,False]
  865.     CHAR_MOVEDIFF[SCR_CURR]
  866.     T=T-1
  867.     If T=0 : SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1 : End If 
  868.     SCRIPT_CURRCOMMAND(SCR_CURR,3)=T
  869.     'Else If C$="KEYDOWN"
  870.   Else If C=14
  871.     A$=Upper$(Inkey$)
  872.     VAR_SET[IV(2),Upper$(PARSE$(1))=A$]
  873.     'Else If C$="TOGGLEDISPLAY"
  874.   Else If C=15
  875.     DISPLAY_SHOW= Not DISPLAY_SHOW
  876.     'Else If C$="WALKTO" 
  877.   Else If C=16
  878.     If SCRIPT_CURRCOMMAND(SCR_CURR,1)=-1
  879.       SCRIPT_CURRCOMMAND(SCR_CURR,1)=PV(1)
  880.       SCRIPT_CURRCOMMAND(SCR_CURR,2)=PV(2)
  881.       SCRIPT_CURRCOMMAND(SCR_CURR,3)=PV(3)
  882.     End If 
  883.     X=X Bob(SCR_CURR) : Y=Y Bob(SCR_CURR)
  884.     DX=SCRIPT_CURRCOMMAND(SCR_CURR,1)
  885.     DY=SCRIPT_CURRCOMMAND(SCR_CURR,2)
  886.     SPEED=SCRIPT_CURRCOMMAND(SCR_CURR,3)
  887.     FX=DX-X : FY=DY-Y
  888.     GD=Max(Abs(FX),Abs(FY))
  889.     'GD=(Abs(FX)+Abs(FY))/2
  890.     If SPEED>GD
  891.       X=DX : Y=DY
  892.       SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1
  893.     Else 
  894.       X=X+(FX*SPEED)/GD
  895.       Y=Y+(FY*SPEED)/GD
  896.       MAP_ZONECHECK[X,OYBOB]
  897.       If Param=0 : X=OXBOB : Y=OYBOB+(FY*SPEED)/FY : End If 
  898.       MAP_ZONECHECK[OXBOB,Y]
  899.       If Param=0 : Y=OYBOB : X=OXBOB+(FX*SPEED)/FX : End If 
  900.     End If 
  901.     Bob SCR_CURR,X,Y,
  902.     NEWFRAME_LOOP[SCR_CURR,False]
  903.     CHAR_MOVEDIFF[SCR_CURR]
  904.     'VAR_SET[IV(4),(X=DX) and(Y=DY)] 
  905.     'Else If C$="CHANGEFRAMEBASE"
  906.   Else If C=17
  907.     CHAR_FRAMEBASE(SCR_CURR)=PV(1)
  908.     'Else If C$="MOVETO" 
  909.   Else If C=18
  910.     Bob SCR_CURR,PV(1),PV(2),
  911.     CHAR_MOVEDIFF(SCR_CURR,0)=X Bob(SCR_CURR)
  912.     CHAR_MOVEDIFF(SCR_CURR,1)=Y Bob(SCR_CURR)
  913.     'Else If C$="IF" 
  914.   Else If C=19
  915.     If SCR_PARSE=2
  916.       RES=(PV(1)=True) : P=2
  917.     Else 
  918.       O$=PARSE$(2) : P=4
  919.       If O$="="
  920.         RES=(PV(1)=PV(3))
  921.       Else If O$="<"
  922.         RES=(PV(1)<PV(3))
  923.       Else If O$=">"
  924.         RES=(PV(1)>PV(3))
  925.       Else If O$="<=" or O$="=<"
  926.         RES=(PV(1)<=PV(3))
  927.       Else If O$="=>" or O$=">="
  928.         RES=(PV(1)=>PV(3))
  929.       Else If O$="<>"
  930.         RES=(PV(1)<>PV(3))
  931.       End If 
  932.     End If 
  933.     If RES
  934.       LABEL$=":"+PARSE$(P)
  935.       A=Hunt(SCR_START To SCR_END,LABEL$)
  936.       If A>0 : PTR=A+Len(LABEL$)+1 : End If 
  937.     End If 
  938.     'Else If C$="WAIT" 
  939.   Else If C=20
  940.     SCRPAUSE(SCR_CURR)=Timer+PV(1)
  941.     'Else If C$="RND"
  942.   Else If C=21
  943.     VAR_SET[IV(1),Rnd(PV(2))]
  944.     'Else If C$="TIMER"
  945.   Else If C=22
  946.     VAR_SET[IV(1),Timer]
  947.     'Else If C$="GLOSET" 
  948.   Else If C=23
  949.     GLOVAR_SET[PV(1),PV(2)]
  950.     'Else If C$="GLOGET" 
  951.   Else If C=24
  952.     GLOVAR_GET[PV(1)] : A=Param : VAR_SET[IV(2),A]
  953.     'Else If C$="BITSET" 
  954.   Else If C=25
  955.     Bset PV(2),PV(1)
  956.     VAR_SET[IV(1),PV(1)]
  957.     'Else If C$="BITCLR" 
  958.   Else If C=26
  959.     Bclr PV(2),PV(1)
  960.     VAR_SET[IV(1),PV(1)]
  961.     'Else If C$="BITCHG" 
  962.   Else If C=27
  963.     Bchg PV(2),PV(1)
  964.     VAR_SET[IV(1),PV(1)]
  965.     'Else If C$="BITGET" 
  966.   Else If C=28
  967.     VAR_SET[IV(3),Btst(PV(2),PV(1))]
  968.   End If 
  969.   'If C$="ADDITEM" 
  970.   If C=29
  971.     ITEM_ADD[PARSE$(1)-Chr$(34)]
  972.     'Else If C$="HAVEITEM" 
  973.   Else If C=30
  974.     ITEM_HAVE[PARSE$(1)-Chr$(34)] : A=Param
  975.     VAR_SET[IV(2),A]
  976.     'Else If C$="TAKEITEM" 
  977.   Else If C=31
  978.     ITEM_REMV[PARSE$(1)-Chr$(34)] : A=Param
  979.     VAR_SET[IV(2),A]
  980.     
  981.     'Else If C$="ITEMSPEC" 
  982.   Else If C=32
  983.     ITEM_STATS[PARSE$(1)-Chr$(34),PARSE$(2)-Chr$(34)] : A=Param
  984.     VAR_SET[IV(3),A]
  985.     'Else If C$="KILL" 
  986.   Else If C=33
  987.     Bob SCR_CURR,-50,-50,
  988.     'Else If C$="LOADLEVEL"
  989.   Else If C=34
  990.     LEVEL_LOADNOW$=PARSE$(1)
  991.     If SCR_PARSE=3
  992.       CONTROLLOCK=True
  993.       CHAR_XPOS=PV(2)
  994.       CHAR_YPOS=PV(3)
  995.       LEVEL_SKIPCHARXY=((PV(2)>-1) and(PV(3)>-1))
  996.     End If 
  997.     SCR_CURR=SCR_MAX
  998.     Pop 
  999.     Goto SUPERSKIP
  1000.     'Else If C$="ITEMREMOVE" 
  1001.   Else If C=35
  1002.     A=Start(58)+768
  1003.     Bset A+(PV(1) mod 8),A+(PV(1)/8)
  1004.     'Else If C$="ITEMISGONE" 
  1005.   Else If C=36
  1006.     A=Start(58)+768
  1007.     VAR_SET[IV(2),Btst(A+(PV(1) mod 8),A+(PV(1)/8))]
  1008.     'Else If C$="ITEMKILL" 
  1009.   Else If C=37
  1010.     A=Start(58)+768
  1011.     If Btst(A+(PV(1) mod 8),A+(PV(1)/8))
  1012.       Bob SCR_CURR,-50,-50,
  1013.     End If 
  1014.     'Else If C$="ITEMPUTBACK"
  1015.   Else If C=38
  1016.     A=Start(58)+768
  1017.     Bclr A+(PV(1) mod 8),A+(PV(1)/8)
  1018.     'Else If C$="ATTACK" 
  1019.   Else If C=39
  1020.     Repeat 
  1021.       DISPLAY_WAIT
  1022.     Until Not DISP_GO
  1023.     DISPLAY_CLOSE
  1024.     If SCR_PARSE=1
  1025.       FIGHT_SETUP[PV(1)]
  1026.     Else 
  1027.       SCRIPT_SCRGROUP[SCR_CURR] : WG=Param
  1028.       FIGHT_SETUP[WG]
  1029.     End If 
  1030.     'Else If C$="SOUND"
  1031.   Else If C=40
  1032.     PARSE$(1)=PARSE$(1)-Chr$(34)
  1033.     SOUND_PLAY[PARSE$(1),Val(PARSE$(3)),Val(PARSE$(2)),269]
  1034.     'Else If C$="BUY"
  1035.   Else If C=41
  1036.     PARSE$(1)=PARSE$(1)-Chr$(34)
  1037.     ITEM_WHICH[PARSE$(1)]
  1038.     If Param>0
  1039.       ITEM_STATS[PARSE$(1),"COST"] : CST=Param
  1040.       RATING_GET["CRED"] : CASH=Param
  1041.       If CASH=>CST
  1042.         CASH=CASH-CST
  1043.         ITEM_ADD[PARSE$(1)]
  1044.         RATING_SET["CRED",CASH]
  1045.         PV(2)=-1
  1046.       Else 
  1047.         PV(2)=0
  1048.       End If 
  1049.     Else 
  1050.       PV(2)=0
  1051.     End If 
  1052.     VAR_SET[IV(2),PV(2)]
  1053.     'Else If C$="SELL" 
  1054.   Else If C=42
  1055.     PARSE$(1)=PARSE$(1)-Chr$(34)
  1056.     ITEM_HAVE[PARSE$(1)]
  1057.     If Param
  1058.       ITEM_STATS[PARSE$(1),"COST"] : SELL=(Param*3)/4
  1059.       RATING_GET["CRED"] : CASH=Param+SELL
  1060.       RATING_SET["CRED",CASH]
  1061.       ITEM_REMV[PARSE$(1)]
  1062.       VAR_SET[IV(2),True]
  1063.     Else 
  1064.       VAR_SET[IV(2),False]
  1065.     End If 
  1066.     'Else If C$="COORDS" 
  1067.   Else If C=43
  1068.     '_IBOB_CHECK[PV(1)]
  1069.     'Trap A=I Bob(PV(1)) 
  1070.     'If A>0
  1071.     X=X Bob(PV(1))
  1072.     Y=Y Bob(PV(1))
  1073.     VAR_SET[IV(2),X]
  1074.     VAR_SET[IV(3),Y]
  1075.     'End If  
  1076.     'Else If C$="RATINGGET"
  1077.   Else If C=44
  1078.     RATING_GET[PARSE$(1)] : A=Param
  1079.     VAR_SET[IV(2),A]
  1080.     'Else If C$="RATINGSET"
  1081.   Else If C=45
  1082.     RATING_SET[PARSE$(1),PV(2)]
  1083.     'Else If C$="FADEOUT"
  1084.   Else If C=46
  1085.     CS=Screen : Screen 2
  1086.     Fade PV(1) : Screen CS
  1087.     Wait PV(1)*15
  1088.     BLACKSCREEN=True
  1089.     'Else If C$="FADEIN" 
  1090.   Else If C=47
  1091.     CS=Screen : Screen 2
  1092.     Fade PV(1) To 0 : Screen CS
  1093.     Wait PV(1)*15
  1094.     BLACKSCREEN=False
  1095.     'Else If C$="LOCKCONTROLS" 
  1096.   Else If C=48
  1097.     CONTROLLOCK=True
  1098.     WALKTHRUWALLS=(PV(1)=1)
  1099.     'Else If C$="UNLOCKCONTROLS" 
  1100.   Else If C=49
  1101.     CONTROLLOCK=False
  1102.     WALKTHRUWALLS=False
  1103.     'Else If C$="[" or C$="]"
  1104.   Else If C=50 or C=51
  1105.     If C=51
  1106.       M$="!"+(PARSE$(1)-Chr$(34))
  1107.       J$=PARSE$(2)
  1108.     Else 
  1109.       M$=PARSE$(1)-Chr$(34) : J$=""
  1110.       
  1111.       If SCR_PARSE=0
  1112.         If TXT_POS>0
  1113.           DISP_GO=True
  1114.           DISPLAY_FIGOPTIONS
  1115.           DISPLAY_TEXT
  1116.           Repeat 
  1117.             DISPLAY_WAIT
  1118.           Until Not DISP_GO
  1119.         End If 
  1120.         TXT_POS=0
  1121.       Else 
  1122.         If SCR_PARSE>1
  1123.           For I=2 To SCR_PARSE
  1124.             TXT_REPLACE[M$,"%"+(Str$(I-1)-" "),Str$(PV(I))-" "]
  1125.             M$=Param$
  1126.           Next 
  1127.         End If 
  1128.         TXT_REPLACE[M$,"%n",CHAR_NAME$] : M$=Param$
  1129.       End If 
  1130.     End If 
  1131.     
  1132.     If TXT_GRAB=-1
  1133.       If SCR_PARSE>0
  1134.         TXT_GRAB=SCR_CURR : TXT_POS=0
  1135.         DISPLAY$(TXT_POS)=M$ : DISP_GO=False
  1136.         DISPLAY_JUMP$(TXT_POS)=J$
  1137.         ISGRAB=True
  1138.         Inc TXT_POS
  1139.       End If 
  1140.     Else If TXT_GRAB=SCR_CURR
  1141.       If SCR_PARSE>0
  1142.         DISPLAY$(TXT_POS)=M$
  1143.         DISPLAY_JUMP$(TXT_POS)=J$
  1144.         ISGRAB=True
  1145.         Inc TXT_POS
  1146.       End If 
  1147.     End If 
  1148.   Else If C=53
  1149.     'PlayMod 
  1150.     A$="mods/"+PARSE$(1)
  1151.     If Exist(A$)=True
  1152.       NEWMOD$=Upper$(A$)
  1153.     End If 
  1154.     
  1155.     If Not MUS_NOPLAY
  1156.       If NEWMOD$<>CURRMOD$
  1157.         For I=63 To 0 Step -4
  1158.            Extension_15_03B0 I : Wait Vbl 
  1159.         Next 
  1160.          Extension_15_0376 : Erase 33
  1161.         If NEWMOD$<>""
  1162.           If Not Exist("RPG:"+NEWMOD$)
  1163.             INEXT_ERROR["Unable to find MOD File",NEWMOD$,"In Mods Directory"]
  1164.           End If 
  1165.            Extension_15_039E "RPG:"+NEWMOD$,33 : Extension_15_03B0 63
  1166.            Extension_15_0384 33
  1167.         End If 
  1168.         CURRMOD$=NEWMOD$
  1169.       End If 
  1170.     End If 
  1171.     
  1172.     'CHANGENAME
  1173.   Else If C=54
  1174.     CHAR_NAME$=PARSE$(1)
  1175.     'QUAKE AMIGA 
  1176.   Else If C=56
  1177.     T=Timer+PV(1)*60
  1178.     Repeat 
  1179.       X=Rnd(4)-2
  1180.       Y=Rnd(4)-2
  1181.       Screen Display 2,128+X,50+Y,,
  1182.       Wait Vbl 
  1183.     Until Timer>T
  1184.     Screen Display 2,128,50,,
  1185.   Else If C=57
  1186.     CS=Screen : Screen 2
  1187.     Fade 2 : Screen CS
  1188.     Wait 30
  1189.     CREDITS[PV(1)]
  1190.     IMDEAD=True
  1191.   End If 
  1192.   If(C<>16) and(C<>52) and(C<>13) : SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1 : End If 
  1193.   Return 
  1194. End Proc
  1195. Procedure SCRIPT_GETCMND[PTR]
  1196.   On Error Proc INEXT_ERRORTRAP
  1197.   A=Hunt(PTR To SCR_END,"|")
  1198.   If A=0
  1199.     SCR_EOF=True
  1200.     Goto __STOPSCR
  1201.   Else 
  1202.     SCR_EOF=False
  1203.     A$= Extension_10_007A(PTR,A-PTR) : A=A+1
  1204.     SCR_PARSE= Extension_10_0512(A$)-1
  1205.     For I=0 To SCR_PARSE
  1206.       PARSE$(I)= Extension_10_0520(I+1,A$)
  1207.     Next 
  1208.   End If 
  1209.   __STOPSCR:
  1210. End Proc[A]
  1211. Procedure SCRIPT_JUMP[SCRIPT,LABEL$]
  1212.   On Error Proc INEXT_ERRORTRAP
  1213.   HSCR_START=Start(70)+Leek(DAT_SCR+(SCRIPT*12))
  1214.   HSCR_END=HSCR_START+Leek(DAT_SCR+(SCRIPT*12)+4)
  1215.   
  1216.   If HSCR_START<>HSCR_END
  1217.     If Not TCH(SCRIPT)
  1218.       LABEL$=":"+LABEL$
  1219.       A=Hunt(HSCR_START To HSCR_END,LABEL$)
  1220.       If A>0
  1221.         Loke DAT_SCR+(SCRIPT*12)+8,(A+Len(LABEL$)+1)-HSCR_START
  1222.         SCRIPT_CURRCOMMAND(SCRIPT,0)=-1
  1223.       End If 
  1224.     End If 
  1225.   End If 
  1226. End Proc
  1227.  
  1228. Procedure VAR_SET[N,V]
  1229.   On Error Proc INEXT_ERRORTRAP
  1230.   If N>-1
  1231.     Loke DAT_VARS+SCR_CURR*256+N*4,V
  1232.   End If 
  1233. End Proc
  1234. Procedure VAR_GET[N]
  1235.   On Error Proc INEXT_ERRORTRAP
  1236. End Proc[Leek(Start(68)+SCR_CURR*256+N*4)]
  1237. Procedure GLOVAR_PREP
  1238.   On Error Proc INEXT_ERRORTRAP
  1239.   Reserve As Work 58,1024
  1240. End Proc
  1241. Procedure GLOVAR_SET[N,V]
  1242.   On Error Proc INEXT_ERRORTRAP
  1243.   Loke Start(58)+N*4,V
  1244. End Proc
  1245. Procedure GLOVAR_GET[N]
  1246.   On Error Proc INEXT_ERRORTRAP
  1247. End Proc[Leek(Start(58)+N*4)]
  1248.  
  1249. Procedure MAP_FRONTSCREEN
  1250.   On Error Proc INEXT_ERRORTRAP
  1251.   Shared FRONT_ISOPEN
  1252.   If Not FRONT_ISOPEN
  1253.     Screen Open 2,320,200,64,Lowres : Flash Off : Curs Off : Cls 0
  1254.     Double Buffer : Autoback 0 : Gr Writing 0
  1255.     For I=0 To 31 : Colour I,0 : Next 
  1256.     FRONT_ISOPEN=True
  1257.     Screen 0
  1258.   End If 
  1259. End Proc
  1260. Procedure MAP_FRONTFADEIN
  1261.   On Error Proc INEXT_ERRORTRAP
  1262.   Shared FRONT_ISOPEN
  1263.   If FRONT_ISOPEN
  1264.     BLACKSCREEN=False
  1265.     S=Screen
  1266.     MAP_DISPLAY
  1267.     Screen 2
  1268.     Fade 3 To 0 : Wait 45
  1269.     FONT_FIND["XEN.font/8"]
  1270.     Set Font Param
  1271.     Screen S
  1272.   End If 
  1273. End Proc
  1274. Procedure MAP_SCREENLOAD[FILE$]
  1275.   On Error Proc INEXT_ERRORTRAP
  1276.   XPK_BANKUNPACK[FILE$,14]
  1277.   Unpack 14 To 0 : Screen Hide 0
  1278.   Erase 14
  1279.   
  1280.   Priority On 
  1281.   Priority Reverse Off 
  1282.   Bob Update Off 
  1283.   
  1284.   MAP_ZONERESET
  1285.   SW=Screen Width-1 : SH=Screen Height-1 : SC=Screen Colour
  1286.   
  1287.   MAP_FRONTCLOSE
  1288.   MAP_FRONTSCREEN
  1289.   
  1290.   DX=CHAR_XPOS-160 : DY=CHAR_YPOS-100
  1291.   If DX>SW-320 : DX=SW-320 : End If 
  1292.   If DX<0 : DX=0 : End If 
  1293.   If DY>SH-200 : DY=SH-200 : End If 
  1294.   If DY<0 : DY=0 : End If 
  1295.   
  1296.   MAP_WIDTH=SW : MAP_HEIGHT=SH
  1297.   MAP_XPOS=DX : MAP_YPOS=DY
  1298.   Screen 0
  1299. End Proc
  1300. Procedure MAP_DISPLAY
  1301.   'On Error Proc INEXT_ERRORTRAP 
  1302.   SC=Screen
  1303.   Bob Clear : Bob Draw 
  1304.   MAP_XPOS=CHAR_XPOS-160
  1305.   MAP_YPOS=CHAR_YPOS-100
  1306.   If MAP_XPOS+320>MAP_WIDTH : MAP_XPOS=MAP_WIDTH-320 : End If 
  1307.   If MAP_XPOS<0 : MAP_XPOS=0 : End If 
  1308.   If MAP_YPOS+200>MAP_HEIGHT : MAP_YPOS=MAP_HEIGHT-200 : End If 
  1309.   If MAP_YPOS<0 : MAP_YPOS=0 : End If 
  1310.   
  1311.   If DISPLAY_SHOW
  1312.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1313.     EFFECT_LAYDOWN
  1314.     Screen Swap : Wait Vbl 
  1315.   End If 
  1316.   Screen SC
  1317. End Proc
  1318. Procedure MAP_OFFSETFIX[X,Y]
  1319.   On Error Proc INEXT_ERRORTRAP
  1320.   MAP_XPOS=X-160
  1321.   MAP_YPOS=Y-100
  1322.   If MAP_XPOS+320>MAP_WIDTH : MAP_XPOS=MAP_WIDTH-320 : End If 
  1323.   If MAP_XPOS<0 : MAP_XPOS=0 : End If 
  1324.   If MAP_YPOS+200>MAP_HEIGHT : MAP_YPOS=MAP_HEIGHT-200 : End If 
  1325.   If MAP_YPOS<0 : MAP_YPOS=0 : End If 
  1326. End Proc
  1327. Procedure MAP_FRONTCLOSE
  1328.   On Error Proc INEXT_ERRORTRAP
  1329.   Shared FRONT_ISOPEN
  1330.   If FRONT_ISOPEN
  1331.     BLACKSCREEN=True
  1332.     Screen 2 : Fade 3 : Wait 45
  1333.     Screen Close 2
  1334.     FRONT_ISOPEN=False
  1335.     Screen 0
  1336.   End If 
  1337. End Proc
  1338.  
  1339. Procedure EFFECT_SETUP
  1340.   On Error Proc INEXT_ERRORTRAP
  1341.   If EFFECT_SETTINGS(0)>0
  1342.     KB=True
  1343.     CF=EFFECT_SETTINGS(0)
  1344.     S=Screen
  1345.     Screen Open 5,320,200,32,Lowres : Curs Off : Cls 0
  1346.     Screen Hide 5
  1347.     If CF=1
  1348.       Screen 0
  1349.       For I=0 To 31
  1350.         E=0 : Z=1 : A=Colour(I)
  1351.         For J=0 To 2
  1352.           E=E+Max((((A/Z) and 15)-2)*Z,0) : Z=Z*16
  1353.         Next 
  1354.         Colour I,E
  1355.       Next 
  1356.       Screen 5
  1357.       For I=1 To EFFECT_SETTINGS(1)
  1358.         X=Rnd(320) : Y=Rnd(200)
  1359.         Ink EFFECT_COLORS(0,2) : Draw X,Y To X,Y+3
  1360.         Ink EFFECT_COLORS(0,1) : Plot X,Y+4
  1361.         Ink EFFECT_COLORS(0,0) : Plot X,Y+5
  1362.       Next 
  1363.       EFFECT_SETTINGS(9)=0
  1364.     Else If CF=2
  1365.       Screen 0
  1366.       For I=0 To 31
  1367.         E=0 : Z=1 : A=Colour(I)
  1368.         For J=0 To 2
  1369.           E=E+Min((((A/Z) and 15)+1),15)*Z : Z=Z*16
  1370.         Next 
  1371.         Colour I,E
  1372.       Next 
  1373.       Screen 5
  1374.       For I=1 To EFFECT_SETTINGS(1)
  1375.         X=Rnd(320) : Y=Rnd(200)
  1376.         Ink EFFECT_COLORS(1,0) : Box X,Y To X+1,Y+1
  1377.         Ink EFFECT_COLORS(1,1) : Plot X,Y+1
  1378.         Ink EFFECT_COLORS(1,2) : Plot X+1,Y
  1379.       Next 
  1380.       EFFECT_SETTINGS(9)=0
  1381.     Else If CF=3
  1382.       KB=False
  1383.       CS=Start(45)
  1384.       EFFECT_SETTINGS(9)=0
  1385.       Screen 0
  1386.       For I=0 To 31
  1387.         E=0 : Z=1 : A=Colour(I)
  1388.         For J=0 To 2
  1389.           E=E+Max((((A/Z) and 15)-4),0)*Z : Z=Z*16
  1390.         Next 
  1391.         Doke CS,E : CS=CS+2
  1392.       Next 
  1393.     Else If CF=4
  1394.       KB=False
  1395.       CS=Start(45)
  1396.       EFFECT_SETTINGS(9)=0
  1397.       Screen 0
  1398.       For I=0 To 31
  1399.         E=0 : F=0 : Z=1 : A=Colour(I)
  1400.         For J=0 To 2
  1401.           F=F+Max((((A/Z) and 15)-2),0)*Z
  1402.           E=E+Min((((A/Z) and 15)+4),15)*Z : Z=Z*16
  1403.         Next 
  1404.         Doke CS,E : CS=CS+2 : Colour I,F
  1405.       Next 
  1406.     Else If CF=5
  1407.       Screen 0
  1408.       SC=Screen Colour-1
  1409.       MX=200 : MZ=-1
  1410.       For I=1 To SC
  1411.         A=Colour(I) : Z=1 : E=0
  1412.         For J=0 To 2
  1413.           E=E+((A/Z) and 15)
  1414.           Z=Z*16
  1415.         Next 
  1416.         If E<MX : MX=E : MZ=I : End If 
  1417.       Next 
  1418.       Screen 5
  1419.       Ink MZ
  1420.       Gr Writing 0
  1421.       For I=8 To 0 Step -1
  1422.         XD=(I*120)/8+40
  1423.         YD=(I*60)/8+40
  1424.         If I=0
  1425.           P=1
  1426.         Else If I=8
  1427.           P=0
  1428.         Else 
  1429.           P=I+27
  1430.         End If 
  1431.         Set Pattern P
  1432.         Cls 0,160-XD,100-YD To 160+XD,100+YD
  1433.         Ink MZ,0 : Bar 160-XD,100-YD To 160+XD,100+YD
  1434.       Next 
  1435.     Else If CF=99
  1436.       XPK_BANKUNPACK["RPG:Maps/effect"+(Str$(EFFECT_SETTINGS(1))-" ")+".spk",29]
  1437.       Unpack 29 To 5
  1438.       Erase 29
  1439.     End If 
  1440.     If KB
  1441.       Get Block 200,0,0,320,200,1
  1442.     End If 
  1443.     Screen Close 5
  1444.     Screen S
  1445.   End If 
  1446.   
  1447. End Proc
  1448. Procedure EFFECT_LAYDOWN
  1449.   'On Error Proc INEXT_ERRORTRAP 
  1450.   ST=Screen
  1451.   If EFFECT_SETTINGS(0)>0
  1452.     If EFFECT_SETTINGS(0)=1 or EFFECT_SETTINGS(0)=2
  1453.       Screen 2
  1454.       Put Block 200,0,EFFECT_SETTINGS(9)
  1455.       Put Block 200,0,EFFECT_SETTINGS(9)-200
  1456.       Screen 0
  1457.       EFFECT_SETTINGS(9)=(EFFECT_SETTINGS(9)+EFFECT_SETTINGS(2)) mod 200
  1458.     Else If EFFECT_SETTINGS(0)=5
  1459.       Screen 2
  1460.       Put Block 200,0,0
  1461.       Screen 0
  1462.     Else If EFFECT_SETTINGS(0)=99
  1463.       Screen 2
  1464.       Put Block 200,0,0
  1465.       Screen 0
  1466.     Else If EFFECT_SETTINGS(0)=3
  1467.       If Rnd(1)=0
  1468.         Screen 2
  1469.         If EFFECT_SETTINGS(9)
  1470.           Get Palette 0
  1471.         Else 
  1472.           S=Start(45)
  1473.           For I=0 To 31
  1474.             Colour I,Deek(S) : S=S+2
  1475.           Next 
  1476.         End If 
  1477.         Screen 0
  1478.         EFFECT_SETTINGS(9)= Not EFFECT_SETTINGS(9)
  1479.       End If 
  1480.     Else If EFFECT_SETTINGS(0)=4
  1481.       Screen 2
  1482.       If EFFECT_SETTINGS(9)
  1483.         Get Palette 0
  1484.         EFFECT_SETTINGS(9)=False
  1485.       Else 
  1486.         If Rnd(10)=0
  1487.           S=Start(45)
  1488.           For I=0 To 31
  1489.             Colour I,Deek(S) : S=S+2
  1490.           Next 
  1491.         End If 
  1492.         EFFECT_SETTINGS(9)=True
  1493.       End If 
  1494.       Screen 0
  1495.     End If 
  1496.   End If 
  1497.   Screen ST
  1498. End Proc
  1499.  
  1500. Procedure NEWMENU_ROUTINE
  1501.   On Error Proc INEXT_ERRORTRAP
  1502.   Repeat 
  1503.     NEWMENU_RESET
  1504.     NEWMENU_ADD["Equipment","Equipment and Inventory"]
  1505.     NEWMENU_ADD["Load/Save","Load or Save a Game"]
  1506.     NEWMENU_ADD["Stats","Statistics"]
  1507.     NEWMENU_ADD["Cancel","Return To Game"]
  1508.     NEWMENU_CHOICE
  1509.     C=Param
  1510.     If C<>3
  1511.       NEWMENU_RESET
  1512.       If C=0
  1513.         Repeat 
  1514.           NEWMENU_RESET
  1515.           NEWMENU_ADD["Equip","Equip A Weapon or Piece of Armor"]
  1516.           NEWMENU_ADD["Use","Use An Item"]
  1517.           NEWMENU_ADD["Main Menu","Return To Main Menu"]
  1518.           NEWMENU_CHOICE
  1519.           D=Param
  1520.           If D<>2
  1521.             If D=1
  1522.               MITEM=-1
  1523.               For I=5 To 261
  1524.                 If ITEMHAVE(I)>0
  1525.                   Inc MITEM
  1526.                 End If 
  1527.               Next 
  1528.               If MITEM>-1
  1529.                 VPOS=0
  1530.                 Repeat 
  1531.                   NEWMENU_RESET
  1532.                   SPOS=VPOS+5 : QPOS=VPOS
  1533.                   CI=0 : IPOS=SPOS
  1534.                   Repeat 
  1535.                     If ITEMHAVE(IPOS)>0
  1536.                       HP=Deek(Start(60)+ITEMHAVE(IPOS)*8+2)
  1537.                       NEWMENU_ADD[ITEMS$(ITEMHAVE(IPOS)),"Use "+ITEMS$(ITEMHAVE(IPOS))+" for"+Str$(HP)+" HP"]
  1538.                       MENU_VAR(CI)=IPOS
  1539.                       Inc CI
  1540.                     End If 
  1541.                     If CI<6 : Inc IPOS : End If 
  1542.                   Until IPOS=262 or CI=6
  1543.                   If CI=6 or VPOS>0
  1544.                     NEWMENU_ADD["More...","See More Items"]
  1545.                   End If 
  1546.                   NEWMENU_ADD["Cancel","Return To Equip Menu"]
  1547.                   NEWMENU_CHOICE
  1548.                   F=Param
  1549.                   If CI=6
  1550.                     If F=6
  1551.                       Add VPOS,6,0 To MITEM
  1552.                     Else If F<6
  1553.                       If Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+6)=4
  1554.                         HP=Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+4)
  1555.                         RATINGS(0)=Min(RATINGS(0)+HP,RATINGS(1))
  1556.                         ITEM_REMFROMSPOT[MENU_VAR(F)]
  1557.                         ITEM_REORG
  1558.                       End If 
  1559.                     End If 
  1560.                   Else 
  1561.                     If VPOS>0 and F=CI
  1562.                       VPOS=0
  1563.                     Else 
  1564.                       If F<CI
  1565.                         If Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+6)=4
  1566.                           HP=Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+4)
  1567.                           RATINGS(0)=Min(RATINGS(0)+HP,RATINGS(1))
  1568.                           ITEM_REMFROMSPOT[MENU_VAR(F)]
  1569.                           ITEM_REORG
  1570.                         End If 
  1571.                       End If 
  1572.                     End If 
  1573.                   End If 
  1574.                   T1=(QPOS=0) and(CI<6) and(CI=F)
  1575.                   T2=((QPOS>0) or(CI<6)) and(F=CI+1)
  1576.                   T3=(CI=6) and(F=CI+1)
  1577.                 Until T1 or T2 or T3
  1578.               End If 
  1579.             Else If D=0
  1580.               Repeat 
  1581.                 NEWMENU_RESET
  1582.                 NEWMENU_ADD["Weapon","Change From "+ITEMS$(ITEMHAVE(0))+" to Another Weapon"]
  1583.                 NEWMENU_ADD["Armor","Change From "+ITEMS$(ITEMHAVE(1))+" to Another Armor"]
  1584.                 NEWMENU_ADD["Gloves","Change From "+ITEMS$(ITEMHAVE(2))+" to Another Set Of Gloves"]
  1585.                 NEWMENU_ADD["Hat","Change From "+ITEMS$(ITEMHAVE(3))+" to Another Hat"]
  1586.                 NEWMENU_ADD["Cancel","Return To Equip Menu"]
  1587.                 NEWMENU_CHOICE
  1588.                 E=Param
  1589.                 If E<>4
  1590.                   VPOS=0 : MITEM=-1
  1591.                   For I=5 To 261
  1592.                     If ITEMHAVE(I)>0
  1593.                       ITN=ITEMHAVE(I)
  1594.                       T=Deek(Start(60)+ITN*8+6)
  1595.                       If T=E
  1596.                         Inc MITEM
  1597.                       End If 
  1598.                     End If 
  1599.                   Next 
  1600.                   If MITEM>-1
  1601.                     Repeat 
  1602.                       NEWMENU_RESET
  1603.                       Q=VPOS : SPOS=5 : QPOS=VPOS
  1604.                       Repeat 
  1605.                         If ITEMHAVE(SPOS)>0
  1606.                           T=Deek(Start(60)+ITEMHAVE(SPOS)*8+6)
  1607.                           If T=E
  1608.                             Dec Q
  1609.                           End If 
  1610.                         End If 
  1611.                         If Q>-1 : Inc SPOS : End If 
  1612.                       Until Q=-1 or SPOS=262
  1613.                       If SPOS=262 and Q>-1
  1614.                         Goto __OUTOFITEMS
  1615.                       End If 
  1616.                       CI=0 : IPOS=SPOS
  1617.                       Repeat 
  1618.                         If ITEMHAVE(IPOS)>0
  1619.                           T=Deek(Start(60)+ITEMHAVE(IPOS)*8+6)
  1620.                           If T=E
  1621.                             NEWMENU_ADD[ITEMS$(ITEMHAVE(IPOS)),"Switch To "+ITEMS$(ITEMHAVE(IPOS))]
  1622.                             MENU_VAR(CI)=IPOS
  1623.                             Inc CI
  1624.                           End If 
  1625.                         End If 
  1626.                         If CI<6 : Inc IPOS : End If 
  1627.                       Until IPOS=262 or CI=6
  1628.                       If CI=6 or VPOS>0
  1629.                         NEWMENU_ADD["More...","See More Items"]
  1630.                       End If 
  1631.                       NEWMENU_ADD["Cancel","Return To Equip Menu"]
  1632.                       NEWMENU_CHOICE
  1633.                       F=Param
  1634.                       If CI=6
  1635.                         If F=6
  1636.                           Add VPOS,6,0 To MITEM
  1637.                         Else If F<6
  1638.                           Swap ITEMHAVE(E),ITEMHAVE(MENU_VAR(F))
  1639.                         End If 
  1640.                       Else 
  1641.                         If VPOS>0 and F=CI
  1642.                           VPOS=0
  1643.                         Else 
  1644.                           If F<CI
  1645.                             Swap ITEMHAVE(E),ITEMHAVE(MENU_VAR(F))
  1646.                           End If 
  1647.                         End If 
  1648.                       End If 
  1649.                       T1=(QPOS=0) and(CI<6) and(CI=F)
  1650.                       T2=((QPOS>0) or(CI<6)) and(F=CI+1)
  1651.                       T3=(CI=6) and(F=CI+1)
  1652.                     Until T1 or T2 or T3
  1653.                   End If 
  1654.                   __OUTOFITEMS:
  1655.                 Until E=4
  1656.               End If 
  1657.             End If 
  1658.           End If 
  1659.         Until D=2
  1660.       Else If C=1
  1661.         NEWMENU_ADD["Load","Load A Game"]
  1662.         NEWMENU_ADD["Save","Save A Game"]
  1663.         NEWMENU_ADD["Main Menu","Return To Main Menu"]
  1664.         Repeat 
  1665.           NEWMENU_CHOICE
  1666.           D=Param
  1667.           If D=0
  1668.             Show On 
  1669.             FILE$=Fsel$("*.game","","Choose A Saved Game")
  1670.             Hide On 
  1671.             If FILE$<>"" : If Exist(FILE$)
  1672.                 GAME_LOAD[FILE$]
  1673.                 D=2 : C=3
  1674.             End If : End If 
  1675.           Else If D=1
  1676.             Show On 
  1677.             FILE$=Fsel$("*.game","","Enter A Name For Your Saved Game")
  1678.             Hide On 
  1679.             If FILE$<>""
  1680.               GAME_SAVE[FILE$]
  1681.             End If 
  1682.           End If 
  1683.         Until D=2
  1684.       Else If C=2
  1685.         NEWMENU_ADD["HP/MHP","HP:"+Str$(RATINGS(0))+"/"+Str$(RATINGS(1))]
  1686.         A$="Str:"+Str$(RATINGS(2))
  1687.         A$=A$+"  Dex:"+Str$(RATINGS(3))
  1688.         A$=A$+"  Int:"+Str$(RATINGS(4))
  1689.         NEWMENU_ADD["Str/Dex/Int",A$]
  1690.         NEWMENU_ADD["Credits",Str$(RATINGS(5))+" Credits"]
  1691.         A$=Str$(RATINGS(6))+"/"
  1692.         Proc RATING_NEXTUP : NUP=Param
  1693.         A$=A$+Str$(NUP)+" Experience to Next Level"
  1694.         NEWMENU_ADD["Exp",A$]
  1695.         Proc ITEM_CALCATTACK : AK=Param
  1696.         Proc ITEM_CALCDEFENSE : DF=Param
  1697.         A$="Attack:"+Str$(AK)
  1698.         A$=A$+"  Defence:"+Str$(DF)
  1699.         NEWMENU_ADD["Atk/Def",A$]
  1700.         NEWMENU_ADD["Main Menu","Return To Main Menu"]
  1701.         Repeat 
  1702.           NEWMENU_CHOICE
  1703.           D=Param
  1704.         Until D=5
  1705.       End If 
  1706.     End If 
  1707.   Until C=3
  1708. End Proc
  1709. Procedure NEWMENU_RESET
  1710.   On Error Proc INEXT_ERRORTRAP
  1711.   Shared MMENU
  1712.   MMENU=-1
  1713. End Proc
  1714. Procedure NEWMENU_ADD[S$,L$]
  1715.   On Error Proc INEXT_ERRORTRAP
  1716.   Shared MMENU
  1717.   Inc MMENU
  1718.   NEWMENU$(MMENU,0)=S$
  1719.   NEWMENU$(MMENU,1)=L$
  1720. End Proc
  1721. Procedure NEWMENU_CHOICE
  1722.   On Error Proc INEXT_ERRORTRAP
  1723.   Shared MMENU
  1724.   
  1725.   S=Screen
  1726.   Screen 2
  1727.   FONT_FIND["XEN.font/8"]
  1728.   Set Font Param
  1729.   Gr Writing 0
  1730.   
  1731.   SPEED=8
  1732.   
  1733.   MENU_XPOS=Min(Max(CHAR_XPOS-MAP_XPOS,80),240)
  1734.   MENU_YPOS=Min(Max(CHAR_YPOS-MAP_YPOS,60),130)
  1735.   
  1736.   DMENU=MMENU+1
  1737.   For I=0 To MMENU
  1738.     ANG=(I*360)/DMENU
  1739.     NEWMENU_POS(I,0)=MENU_XPOS+Sin(ANG)*50
  1740.     NEWMENU_POS(I,1)=MENU_YPOS-Cos(ANG)*50
  1741.   Next 
  1742.   CMENU=0
  1743.   
  1744.   For FRAMES=0 To SPEED
  1745.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1746.     
  1747.     For I=0 To MMENU
  1748.       CI=(CMENU+I) mod DMENU
  1749.       A=Text Length(NEWMENU$(CI,0))
  1750.       A=A/2
  1751.       
  1752.       XD=NEWMENU_POS(I,0)-MENU_XPOS
  1753.       YD=NEWMENU_POS(I,1)-MENU_YPOS
  1754.       
  1755.       XP=MENU_XPOS+(XD*FRAMES)/SPEED
  1756.       YP=MENU_YPOS+(YD*FRAMES)/SPEED
  1757.       
  1758.       DXP=XP-A-2 : CXP=XP+A+2
  1759.       Cls MENU_COLORS(0),DXP,YP-10 To CXP,YP+2
  1760.       Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1761.       Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1762.       Ink MENU_COLORS(3) : Text XP-A,YP-1,NEWMENU$(CI,0)
  1763.     Next 
  1764.     
  1765.     Cls MENU_COLORS(0),0,190 To 320,200
  1766.     Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1767.     Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1768.     Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(OMENU,1)
  1769.     Screen Swap : Extension_18_0A50 VB_LINE
  1770.   Next 
  1771.   
  1772.   Repeat 
  1773.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1774.     
  1775.     For I=0 To MMENU
  1776.       CI=(CMENU+I) mod DMENU
  1777.       A=Text Length(NEWMENU$(CI,0))
  1778.       A=A/2
  1779.       
  1780.       XP=NEWMENU_POS(I,0) : YP=NEWMENU_POS(I,1)
  1781.       DXP=XP-A-2 : CXP=XP+A+2
  1782.       Cls MENU_COLORS(0),DXP,NEWMENU_POS(I,1)-10 To CXP,NEWMENU_POS(I,1)+2
  1783.       Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1784.       Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1785.       Ink MENU_COLORS(3) : Text NEWMENU_POS(I,0)-A,NEWMENU_POS(I,1)-1,NEWMENU$(CI,0)
  1786.     Next 
  1787.     
  1788.     Cls MENU_COLORS(0),0,190 To 320,200
  1789.     Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1790.     Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1791.     Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(CMENU,1)
  1792.     
  1793.     Screen Swap : Extension_18_0A50 VB_LINE
  1794.     
  1795.     OMENU=CMENU
  1796.     Repeat 
  1797.       SNAPSHOT
  1798.       J=Joy(1)
  1799.       Multi Wait 
  1800.     Until J>0
  1801.     
  1802.     If Btst(2,J)
  1803.       Add CMENU,1,0 To MMENU
  1804.       D=1
  1805.     Else If Btst(3,J)
  1806.       Add CMENU,-1,0 To MMENU
  1807.       D=-1
  1808.     End If 
  1809.     Repeat : Until Joy(1)=0
  1810.     
  1811.     If OMENU<>CMENU
  1812.       For FRAMES=0 To SPEED
  1813.         Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1814.         For I=0 To MMENU
  1815.           NI=(D+I+DMENU) mod DMENU
  1816.           CI=(CMENU+I) mod DMENU
  1817.           A=Text Length(NEWMENU$(CI,0))
  1818.           A=A/2
  1819.           
  1820.           XD=NEWMENU_POS(I,0)-NEWMENU_POS(NI,0)
  1821.           YD=NEWMENU_POS(I,1)-NEWMENU_POS(NI,1)
  1822.           
  1823.           XP=NEWMENU_POS(NI,0)+(XD*FRAMES)/SPEED
  1824.           YP=NEWMENU_POS(NI,1)+(YD*FRAMES)/SPEED
  1825.           DXP=XP-A-2 : CXP=XP+A+2
  1826.           Cls MENU_COLORS(0),DXP,YP-10 To CXP,YP+2
  1827.           Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1828.           Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1829.           Ink MENU_COLORS(3) : Text XP-A,YP-1,NEWMENU$(CI,0)
  1830.         Next 
  1831.         Cls MENU_COLORS(0),0,190 To 320,200
  1832.         Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1833.         Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1834.         Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(OMENU,1)
  1835.         Screen Swap : Extension_18_0A50 VB_LINE
  1836.       Next 
  1837.     End If 
  1838.     
  1839.   Until Btst(4,J)
  1840.   For FRAMES=SPEED To 0 Step -1
  1841.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1842.     For I=0 To MMENU
  1843.       CI=(CMENU+I) mod DMENU
  1844.       A=Text Length(NEWMENU$(CI,0))
  1845.       A=A/2
  1846.       
  1847.       XD=NEWMENU_POS(I,0)-MENU_XPOS
  1848.       YD=NEWMENU_POS(I,1)-MENU_YPOS
  1849.       
  1850.       XP=MENU_XPOS+(XD*FRAMES)/SPEED
  1851.       YP=MENU_YPOS+(YD*FRAMES)/SPEED
  1852.       DXP=XP-A-2 : CXP=XP+A+2
  1853.       Cls MENU_COLORS(0),DXP,YP-10 To CXP,YP+2
  1854.       Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1855.       Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1856.       Ink MENU_COLORS(3) : Text XP-A,YP-1,NEWMENU$(CI,0)
  1857.     Next 
  1858.     Ink MENU_COLORS(0) : Bar 0,190 To 320,200
  1859.     Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1860.     Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1861.     Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(OMENU,1)
  1862.     Screen Swap : Extension_18_0A50 VB_LINE
  1863.   Next 
  1864.   Screen S
  1865. End Proc[CMENU]
  1866.  
  1867. Procedure CLR_SETUP
  1868.   On Error Proc INEXT_ERRORTRAP
  1869.   For I=0 To 3
  1870.     FIND_PEN[$111*(I*5)]
  1871.     MENU_COLORS(I)=Param
  1872.   Next 
  1873. End Proc
  1874.  
  1875. Procedure MAP_ZONERESET
  1876.   On Error Proc INEXT_ERRORTRAP
  1877.   Reserve Zone 256
  1878.   Reserve As Work 62,6000
  1879. End Proc
  1880. Procedure MAP_ZONESET[WHICH,X1,Y1,X2,Y2,TYPE]
  1881.   On Error Proc INEXT_ERRORTRAP
  1882.   If X1>X2 : Swap X1,X2 : End If 
  1883.   If Y1>Y2 : Swap Y1,Y2 : End If 
  1884.   X2=Min(X2,Screen Width-1)
  1885.   Y2=Min(Y2,Screen Height-1)
  1886.   _X1=X1 : _X2=X2 : _Y1=Y1 : _Y2=Y2 : _WHICH=WHICH
  1887.   Set Zone WHICH+1,X1,Y1 To X2,Y2
  1888.   Loke Start(62)+(WHICH*20),TYPE
  1889. End Proc
  1890. Procedure MAP_ZONESETVAR[WHICH,VAR,VL]
  1891.   On Error Proc INEXT_ERRORTRAP
  1892.   Loke Start(62)+(WHICH*20)+4+(VAR*4),VL
  1893. End Proc
  1894. Procedure MAP_ZONEGETVAR[WHICH,VAR]
  1895.   On Error Proc INEXT_ERRORTRAP
  1896. End Proc[Leek(Start(62)+(WHICH*20)+4+(VAR*4))]
  1897. Procedure MAP_ZONECHECK[X,Y]
  1898.   On Error Proc INEXT_ERRORTRAP
  1899.   ZNE_CHECKED=Zone(X,Y)-1
  1900.   If ZNE_CHECKED>-1
  1901.     T=Leek(Start(62)+ZNE_CHECKED*20)
  1902.   Else 
  1903.     T=-1
  1904.   End If 
  1905. End Proc[T]
  1906.  
  1907. Procedure CHAR_COLLIDE[DIST]
  1908.   On Error Proc INEXT_ERRORTRAP
  1909.   P=-1 : DX=DIST : DY=DIST
  1910.   If SCR_MAX>0
  1911.     For I=1 To SCR_MAX
  1912.       X=Abs(X Bob(I)-CHAR_XPOS)
  1913.       Y=Abs(Y Bob(I)-CHAR_YPOS)
  1914.       If X<DX and Y<DY
  1915.         DX=Min(X,DX) : DY=Min(Y,DY) : P=I
  1916.       End If 
  1917.     Next 
  1918.   End If 
  1919. End Proc[P]
  1920. Procedure CHAR_FACE[C1,C2]
  1921.   On Error Proc INEXT_ERRORTRAP
  1922.   NEWFRAME_CHANGE[C1] : A=Param
  1923.   NEWFRAME_CHANGE[C2] : A=(A or Param)
  1924.   If Not A
  1925.     CHAR_MOVEDIFF(C1,0)=X Bob(C1)+(X Bob(C1)-X Bob(C2))
  1926.     CHAR_MOVEDIFF(C1,1)=Y Bob(C1)+(Y Bob(C1)-Y Bob(C2))
  1927.     CHAR_MOVEDIFF[C1]
  1928.     CHAR_MOVEDIFF(C2,0)=X Bob(C2)+(X Bob(C2)-X Bob(C1))
  1929.     CHAR_MOVEDIFF(C2,1)=Y Bob(C2)+(Y Bob(C2)-Y Bob(C1))
  1930.     CHAR_MOVEDIFF[C2]
  1931.   End If 
  1932. End Proc
  1933.  
  1934. Procedure FONT_FIND[NAME$]
  1935.   On Error Proc INEXT_ERRORTRAP
  1936.   NAME$=Upper$(NAME$)
  1937.   Get Rom Fonts : S=1 : F=-1
  1938.   Repeat 
  1939.     If Font$(S)<>""
  1940.       A$=Upper$( Extension_10_0520(1,Font$(S))+"/"+ Extension_10_0520(2,Font$(S)))
  1941.       If A$=NAME$ : F=S : SKIP=True : End If 
  1942.       S=S+1
  1943.     End If 
  1944.   Until SKIP or Font$(S)=""
  1945.   If Not SKIP
  1946.     Get Disc Fonts : S=1
  1947.     Repeat 
  1948.       If Font$(S)<>""
  1949.         A$=Upper$( Extension_10_0520(1,Font$(S))+"/"+ Extension_10_0520(2,Font$(S)))
  1950.         If A$=NAME$ : F=S : SKIP=True : End If 
  1951.         S=S+1
  1952.       End If 
  1953.     Until SKIP or Font$(S)=""
  1954.   End If 
  1955. End Proc[F]
  1956. Procedure TXT_REPLACE[O$,S$,R$]
  1957.   On Error Proc INEXT_ERRORTRAP
  1958.   A=Instr(O$,S$)
  1959.   If A>0
  1960.     Repeat 
  1961.       O$=Left$(O$,A-1)+R$+Mid$(O$,A+Len(S$))
  1962.       A=Instr(O$,S$)
  1963.     Until A=0
  1964.   End If 
  1965. End Proc[O$]
  1966. Procedure FIND_PEN[CLR]
  1967.   On Error Proc INEXT_ERRORTRAP
  1968.   SC=Screen Colour-1
  1969.   MX=200 : MZ=-1
  1970.   For I=0 To SC
  1971.     A=Colour(I) : Z=1 : E=0
  1972.     For J=0 To 2
  1973.       E=E+Abs(((A/Z) and 15)-((CLR/Z) and 15))
  1974.       Z=Z*16
  1975.     Next 
  1976.     If E<MX : MX=E : MZ=I : End If 
  1977.   Next 
  1978. End Proc[MZ]
  1979.  
  1980. Procedure DISPLAY_OPEN
  1981.   On Error Proc INEXT_ERRORTRAP
  1982.   If DISP_ISOPEN=False
  1983.     S=Screen
  1984.     Screen 2
  1985.     FONT_FIND["helvetica.font/15"]
  1986.     Set Font Param
  1987.     Set Text 2
  1988.     Gr Writing 0
  1989.     DISP_ISOPEN=True
  1990.     Screen S
  1991.   End If 
  1992. End Proc
  1993. Procedure DISPLAY_CLOSE
  1994.   On Error Proc INEXT_ERRORTRAP
  1995.   
  1996.   If DISP_ISOPEN=True
  1997.     DISP_ISOPEN=False
  1998.     Screen S
  1999.   End If 
  2000. End Proc
  2001. Procedure DISPLAY_FIGOPTIONS
  2002.   On Error Proc INEXT_ERRORTRAP
  2003.   DISP_OPTION=-1
  2004.   For I=0 To TXT_POS-1
  2005.     If Left$(DISPLAY$(I),1)="!"
  2006.       DISP_OPTION=I : I=TXT_POS
  2007.     End If 
  2008.   Next 
  2009. End Proc
  2010. Procedure DISPLAY_TEXT
  2011.   On Error Proc INEXT_ERRORTRAP
  2012.   If Not DISP_ISOPEN
  2013.     DISPLAY_OPEN
  2014.   End If 
  2015.   S=Screen : Screen 2
  2016.   Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  2017.   EFFECT_LAYDOWN
  2018.   BY=(TXT_POS-1)*19+24
  2019.   Gr Writing 1 : Ink MENU_COLORS(0),MENU_COLORS(1)
  2020.   Set Pattern 32
  2021.   Bar 0,0 To 320,BY
  2022.   Set Pattern 0
  2023.   Gr Writing 0
  2024.   Ink MENU_COLORS(1) : Box 0,0 To 319,BY
  2025.   Ink MENU_COLORS(2) : Polyline 0,BY To 0,0 To 320,0
  2026.   For I=0 To TXT_POS-1
  2027.     D=(I*19)+16
  2028.     If Left$(DISPLAY$(I),1)="!"
  2029.       X=24 : A$=Mid$(DISPLAY$(I),2)
  2030.     Else 
  2031.       X=4 : A$=DISPLAY$(I)
  2032.     End If 
  2033.     Ink MENU_COLORS(2) : Text X-1,D,A$
  2034.     Ink MENU_COLORS(1) : Text X+1,D,A$
  2035.     Ink MENU_COLORS(3) : Text X,D,A$
  2036.     If I=DISP_OPTION
  2037.       DPOINTER[5,D-15]
  2038.     End If 
  2039.   Next 
  2040.   Screen Swap : Extension_18_0A50 VB_LINE
  2041.   Screen S
  2042. End Proc
  2043. Procedure DISPLAY_WAIT
  2044.   On Error Proc INEXT_ERRORTRAP
  2045.   If DISP_GO
  2046.     SNAPSHOT
  2047.     If(DISP_OPTION>-1) and(Joy(1) and 3)<>0
  2048.       If Jup(1) : M=-1 : End If 
  2049.       If Jdown(1) : M=1 : End If 
  2050.       Repeat 
  2051.         Add DISP_OPTION,M,0 To TXT_POS-1
  2052.       Until Left$(DISPLAY$(DISP_OPTION),1)="!"
  2053.       DISPLAY_TEXT
  2054.       Repeat : Until Joy(1)=0
  2055.     End If 
  2056.     If Fire(1)
  2057.       If DISP_OPTION>-1
  2058.         SCRIPT_JUMP[TXT_GRAB,DISPLAY_JUMP$(DISP_OPTION)]
  2059.       End If 
  2060.       DISP_GO=False : TXT_POS=0
  2061.       Repeat : Until Fire(1)=True
  2062.       Repeat : Until Fire(1)=False
  2063.     End If 
  2064.   End If 
  2065. End Proc
  2066.  
  2067. Procedure AA_FONT[X,Y,TXT$]
  2068.   On Error Proc INEXT_ERRORTRAP
  2069.   Ink MENU_COLORS(1) : Text X-1,Y,TXT$
  2070.   Ink MENU_COLORS(2) : Text X+1,Y,TXT$
  2071.   Ink MENU_COLORS(3) : Text X,Y,TXT$
  2072. End Proc
  2073. Procedure AA_REVFONT[X,Y,TXT$]
  2074.   On Error Proc INEXT_ERRORTRAP
  2075.   Ink MENU_COLORS(1) : Text X-1,Y,TXT$
  2076.   Ink MENU_COLORS(2) : Text X+1,Y,TXT$
  2077.   Ink MENU_COLORS(0) : Text X,Y,TXT$
  2078. End Proc
  2079. Procedure AA_BOX[X1,Y1,X2,Y2]
  2080.   On Error Proc INEXT_ERRORTRAP
  2081.   Ink MENU_COLORS(1) : Box X1,Y1 To X2,Y2
  2082.   Box X1+1,Y1+1 To X2-1,Y2-1
  2083.   Ink MENU_COLORS(2) : Polyline X1,Y2 To X1,Y1 To X2,Y1
  2084.   Polyline X1+1,Y2-1 To X1+1,Y1+1 To X2-1,Y1+1
  2085. End Proc
  2086. Procedure AA_BAR[X1,Y1,X2,Y2]
  2087.   On Error Proc INEXT_ERRORTRAP
  2088.   Cls 2,X1,Y1 To X2,Y2
  2089.   AA_BOX[X1,Y1,X2,Y2]
  2090. End Proc
  2091.  
  2092. Procedure ITEM_CALCATTACK
  2093.   On Error Proc INEXT_ERRORTRAP
  2094.   ITEM_STATS[ITEMS$(ITEMHAVE(0)),"WEAPON"]
  2095.   A=Param+(RATINGS(2)/4)+(RATINGS(4)/8)
  2096. End Proc[A]
  2097. Procedure ITEM_CALCDEFENSE
  2098.   On Error Proc INEXT_ERRORTRAP
  2099.   ITEM_STATS[ITEMS$(ITEMHAVE(1)),"ARMOR"] : A=Param
  2100.   ITEM_STATS[ITEMS$(ITEMHAVE(2)),"ARMOR"] : A=A+Param
  2101.   ITEM_STATS[ITEMS$(ITEMHAVE(3)),"ARMOR"] : A=A+Param
  2102.   A=A+(RATINGS(3)/4)+(RATINGS(4)/8)
  2103. End Proc[A]
  2104. Procedure ITEM_PREP
  2105.   On Error Proc INEXT_ERRORTRAP
  2106.   Shared ITEM_CURR
  2107.   Reserve As Work 60,2048
  2108.   ITEMS$(0)="Nothing"
  2109.   ITEM_CURR=1
  2110.   Open In 3,"items.data"
  2111.   Set Input 10,-1
  2112.   Repeat 
  2113.     Line Input #3,A$
  2114.     If Extension_10_0512(A$)=6
  2115.       NAME$= Extension_10_0520(1,A$)
  2116.       WP=Val( Extension_10_0520(2,A$))
  2117.       AP=Val( Extension_10_0520(3,A$))
  2118.       HP=Val( Extension_10_0520(4,A$))
  2119.       CS=Val( Extension_10_0520(5,A$))
  2120.       TYPE=Val( Extension_10_0520(6,A$))
  2121.       ITEM_ADDNAME[NAME$,WP,AP,HP,CS,TYPE]
  2122.     End If 
  2123.   Until Eof(3)
  2124.   Close 3
  2125. End Proc
  2126. Procedure ITEM_ADDNAME[NAME$,WP,AP,HP,CS,TYPE]
  2127.   On Error Proc INEXT_ERRORTRAP
  2128.   Shared ITEM_CURR
  2129.   ITEMS$(ITEM_CURR)=NAME$
  2130.   S=Start(60)+(ITEM_CURR*8)
  2131.   Poke S,WP
  2132.   Poke S+1,AP
  2133.   Doke S+2,HP
  2134.   Doke S+4,CS
  2135.   Doke S+6,TYPE
  2136.   Inc ITEM_CURR
  2137. End Proc
  2138.  
  2139. Procedure ITEM_REORG
  2140.   On Error Proc INEXT_ERRORTRAP
  2141.   For I=260 To 5 Step -1
  2142.     If ITEMHAVE(I)>0
  2143.       S=I : I=5
  2144.     End If 
  2145.   Next 
  2146.   For I=5 To S
  2147.     If ITEMHAVE(I)=0
  2148.       For J=I+1 To 261
  2149.         ITEMHAVE(J-1)=ITEMHAVE(J)
  2150.       Next 
  2151.       ITEMHAVE(261)=0
  2152.     End If 
  2153.   Next 
  2154. End Proc
  2155. Procedure ITEM_WHICH[NAME$]
  2156.   On Error Proc INEXT_ERRORTRAP
  2157.   Shared ITEM_CURR
  2158.   NAME$=Upper$(NAME$) : RES=0
  2159.   For I=1 To ITEM_CURR-1
  2160.     If NAME$=Upper$(ITEMS$(I))
  2161.       RES=I : I=ITEM_CURR
  2162.     End If 
  2163.   Next 
  2164. End Proc[RES]
  2165.  
  2166. Procedure ITEM_INSPOT[SPOT]
  2167.   On Error Proc INEXT_ERRORTRAP
  2168. End Proc[ITEMS$(ITEMHAVE(SPOT))]
  2169. Procedure ITEM_REMFROMSPOT[SPOT]
  2170.   On Error Proc INEXT_ERRORTRAP
  2171.   A$=ITEMS$(ITEMHAVE(SPOT))
  2172.   ITEMHAVE(SPOT)=0
  2173. End Proc[A$]
  2174. Procedure ITEM_ADDTOSPOT[NAME$,SPOT]
  2175.   On Error Proc INEXT_ERRORTRAP
  2176.   ITEM_WHICH[NAME$] : WHICH=Param
  2177.   ITEMHAVE(SPOT)=WHICH
  2178. End Proc
  2179. Procedure ITEM_ADDNUMSPOT[NUM,SPOT]
  2180.   On Error Proc INEXT_ERRORTRAP
  2181.   ITEMHAVE(SPOT)=NUM
  2182. End Proc
  2183. Procedure ITEM_ADD[NAME$]
  2184.   On Error Proc INEXT_ERRORTRAP
  2185.   For I=5 To 261
  2186.     If ITEMHAVE(I)=0
  2187.       ITEM_WHICH[NAME$]
  2188.       ITEMHAVE(I)=Param : I=261
  2189.     End If 
  2190.   Next 
  2191. End Proc
  2192. Procedure ITEM_REMV[NAME$]
  2193.   On Error Proc INEXT_ERRORTRAP
  2194.   ITEM_WHICH[NAME$] : WHICH=Param
  2195.   For I=5 To 261
  2196.     If ITEMHAVE(I)=WHICH
  2197.       ITEMHAVE(I)=0 : I=261 : RES=True
  2198.     End If 
  2199.   Next 
  2200. End Proc[RES]
  2201. Procedure ITEM_HAVE[NAME$]
  2202.   On Error Proc INEXT_ERRORTRAP
  2203.   ITEM_WHICH[NAME$] : WHICH=Param
  2204.   For I=5 To 261
  2205.     If ITEMHAVE(I)=WHICH
  2206.       I=261 : RES=True
  2207.     End If 
  2208.   Next 
  2209. End Proc[RES]
  2210. Procedure ITEM_STATS[NAME$,WHICH$]
  2211.   On Error Proc INEXT_ERRORTRAP
  2212.   ITEM_WHICH[NAME$] : WHICH=Param
  2213.   A=0
  2214.   If WHICH>0
  2215.     WHICH=Start(60)+WHICH*8
  2216.     WHICH$=Upper$(WHICH$)
  2217.     If WHICH$="WEAPON"
  2218.       A=Peek(WHICH)
  2219.     Else If WHICH$="ARMOR"
  2220.       A=Peek(WHICH+1)
  2221.     Else If WHICH$="HP"
  2222.       A=Deek(WHICH+2)
  2223.     Else If WHICH$="COST"
  2224.       A=Deek(WHICH+4)
  2225.     Else If WHICH$="TYPE"
  2226.       A=Deek(WHICH+6)
  2227.     End If 
  2228.   End If 
  2229. End Proc[A]
  2230.  
  2231. Procedure RATING_ADD[NAME$,V]
  2232.   On Error Proc INEXT_ERRORTRAP
  2233.   NAME$=Upper$(NAME$)
  2234.   For I=0 To 5
  2235.     Read A$
  2236.     If A$=NAME$
  2237.       RATINGS(I)=RATINGS(I)+V
  2238.     End If 
  2239.   Next 
  2240.   Pop Proc
  2241.   Data "HP","MHP","STR","INT","DEX","CRED"
  2242. End Proc
  2243. Procedure RATING_SET[NAME$,V]
  2244.   On Error Proc INEXT_ERRORTRAP
  2245.   NAME$=Upper$(NAME$)
  2246.   For I=0 To 5
  2247.     Read A$
  2248.     If A$=NAME$
  2249.       RATINGS(I)=V
  2250.     End If 
  2251.   Next 
  2252.   Pop Proc
  2253.   Data "HP","MHP","STR","INT","DEX","CRED"
  2254. End Proc
  2255. Procedure RATING_GET[NAME$]
  2256.   On Error Proc INEXT_ERRORTRAP
  2257.   NAME$=Upper$(NAME$)
  2258.   For I=0 To 5
  2259.     Read A$
  2260.     If A$=NAME$
  2261.       V=RATINGS(I)
  2262.     End If 
  2263.   Next 
  2264.   Data "HP","MHP","STR","INT","DEX","CRED"
  2265. End Proc[V]
  2266. Procedure RATING_NEXTUP
  2267.   On Error Proc INEXT_ERRORTRAP
  2268.   NXTUP=(RATINGS(1)*1.2)+(RATINGS(2)+RATINGS(3)+RATINGS(4)-15)*12
  2269. End Proc[NXTUP]
  2270.  
  2271. Procedure FIGHT_SETUP[GROUP]
  2272.   On Error Proc INEXT_ERRORTRAP
  2273.   Shared ENEMY_CURRMARK,NOKILL,ENEMY_GROUP
  2274.   SCRIPT_GETGROUP[GROUP]
  2275.   If ENEMY_MAX>-1
  2276.     ENEMY_GROUP=GROUP/10
  2277.     NOKILL=(GROUP>99)
  2278.     ENEMY_CURRMARK=-1
  2279.     Reserve As Work 65,(ENEMY_MAX+2)*16
  2280.     POS_START=Start(65)
  2281.     NEWFRAME_RESET
  2282.     For I=0 To ENEMY_MAX
  2283.       ANG=(I*360)/(ENEMY_MAX+1)
  2284.       DX=CHAR_XPOS+Sin(ANG)*50
  2285.       DY=CHAR_YPOS-Cos(ANG)*50
  2286.       WE=FIGHT_ENEMIES(I)
  2287.       Loke POS_START+(I*16),DX-X Bob(WE)
  2288.       Loke POS_START+(I*16)+4,DY-Y Bob(WE)
  2289.       Loke POS_START+(I*16)+8,X Bob(WE)
  2290.       Loke POS_START+(I*16)+12,Y Bob(WE)
  2291.       FIGHT_RESPONSE(I)=0
  2292.     Next 
  2293.     FIGHT_RESPONSE(16)=0
  2294.     NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+4,False]
  2295.     For I=4 To 7
  2296.       NEWFRAME_GRABSET[CHAR_FRAMEBASE(0)+I]
  2297.     Next 
  2298.     For J=0 To ENEMY_MAX
  2299.       For K=4 To 7
  2300.         NEWFRAME_GRABSET[CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+K]
  2301.       Next 
  2302.       NEWFRAME_SET[FIGHT_ENEMIES(J),CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+6,False]
  2303.     Next 
  2304.     NEWFRAME_GRABSET[4090]
  2305.     NEWFRAME_FULLREQUEST
  2306.     For I=1 To 10
  2307.       HEI=Sin((I*180)/10)*20
  2308.       ALLDONE=True
  2309.       For J=0 To ENEMY_MAX
  2310.         BX=Leek(POS_START+J*16+8) : DX=Leek(POS_START+J*16)
  2311.         BY=Leek(POS_START+J*16+12) : DY=Leek(POS_START+J*16+4)
  2312.         
  2313.         PX=BX+(DX*I)/10
  2314.         PY=BY+(DY*I)/10-HEI
  2315.         
  2316.         Bob FIGHT_ENEMIES(J),PX,PY,
  2317.         'CHAR_MOVEDIFF[FIGHT_ENEMIES(J)] 
  2318.       Next 
  2319.       NEWFRAME_MOVE[0,False]
  2320.       MAP_DISPLAY
  2321.     Next 
  2322.     For J=0 To EMENY_MAX
  2323.       NEWFRAME_SET[FIGHT_ENEMIES(J),CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+4,False]
  2324.     Next 
  2325.     Repeat 
  2326.       ALLDONE=True
  2327.       For J=0 To ENEMY_MAX
  2328.         NEWFRAME_MOVE[FIGHT_ENEMIES(J),False]
  2329.         ALLDONE=ALLDONE and Param
  2330.       Next 
  2331.       NEWFRAME_MOVE[0,False]
  2332.       ALLDONE=ALLDONE and Param
  2333.       MAP_DISPLAY
  2334.     Until ALLDONE
  2335.     
  2336.     'Fight Data
  2337.     'AABBCCCDD: AA (10000000) Attack 
  2338.     '           BB (100000)   Defense
  2339.     '           CCC
  2340.     
  2341.     CM=-1
  2342.     For J=0 To ENEMY_MAX
  2343.       FIGHT_ATTACK(J)=FIGHT_POWER(J)/10000000
  2344.       FIGHT_DEFENSE(J)=(FIGHT_POWER(J)/100000) mod 100
  2345.       FIGHT_HP(J)=(FIGHT_POWER(J)/100) mod 1000
  2346.       CM=Max(FIGHT_POWER(J) mod 100,CM)
  2347.     Next 
  2348.     RATING_GET["DEX"]
  2349.     FRSPEED=Param
  2350.     CM=Max(FRSPEED,CM)
  2351.  
  2352.     CHARGE_SPEED=14
  2353.  
  2354.     For J=0 To ENEMY_MAX
  2355.       FIGHT_CHARGE(J)=((FIGHT_POWER(J) mod 100)*CHARGE_SPEED)/CM
  2356.     Next 
  2357.     FIGHT_CHARGE(16)=(FRSPEED*CHARGE_SPEED)/CM
  2358.     
  2359.     For J=0 To ENEMY_MAX
  2360.       NEWFRAME_SET[FIGHT_ENEMIES(J),CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+5,False]
  2361.     Next 
  2362.     NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+5,False]
  2363.     MAP_DISPLAY
  2364.     
  2365.     SOUND_PLAY["RPG:Sounds/Fight.iff",15,8000,236]
  2366.     
  2367.     FIGHT_SCREENOPEN
  2368.     FIGHT
  2369.     FIGHT_SCREENCLOSE
  2370.   End If 
  2371. End Proc[ENEMY_MAX]
  2372. Procedure FIGHT_SCREENOPEN
  2373.   On Error Proc INEXT_ERRORTRAP
  2374.   S=Screen
  2375.   Screen 2
  2376.   FONT_FIND["XEN.font/8"]
  2377.   Set Font Param
  2378.   
  2379.   Screen Open 1,320,24,8,Lowres : Flash Off : Curs Off : Cls 0
  2380.   Screen Hide 1
  2381.   Double Buffer : Autoback 0
  2382.   FONT_FIND["XEN.font/8"]
  2383.   Set Font Param
  2384.   Gr Writing 0
  2385.   Palette $0,$111,$222,$333,$444,$555,$666,$FFF
  2386.   If CHAR_YPOS-MAP_YPOS<100
  2387.     Screen Display 1,,226,,0
  2388.   Else 
  2389.     Screen Display 1,,50,,0
  2390.   End If 
  2391.   FIGHT_SCREENUPDATE
  2392.   Screen Show 1
  2393.   For I=0 To 24 Step 4
  2394.     Screen Display 1,,,,I
  2395.      Extension_18_0A50 VB_LINE
  2396.   Next 
  2397.   Screen Display 1,,,,24
  2398.   FIGHT_ENEMYWHICH[0]
  2399.   Screen S
  2400. End Proc
  2401. Procedure FIGHT_SCREENCLOSE
  2402.   On Error Proc INEXT_ERRORTRAP
  2403.   For I=24 To 0 Step -4
  2404.     Screen Display 1,,,,I
  2405.      Extension_18_0A50 VB_LINE
  2406.   Next 
  2407.   Screen Close 1
  2408. End Proc
  2409. Procedure FIGHT_BACKDROP
  2410.   On Error Proc INEXT_ERRORTRAP
  2411.   For I=0 To 6
  2412.     Cls I,0,(I*24)/7 To 320,((I+1)*24)/7
  2413.   Next 
  2414. End Proc
  2415. Procedure FIGHT_SCREENUPDATE
  2416.   On Error Proc INEXT_ERRORTRAP
  2417.   Shared FIGHT_CURROPTION
  2418.   S=Screen : Screen 1
  2419.   FIGHT_BACKDROP
  2420.   If FIGHT_CURROPTION=0
  2421.     A$="Attack"
  2422.   Else If FIGHT_CURROPTION=1
  2423.     A$="LightHeal"
  2424.   Else If FIGHT_CURROPTION=2
  2425.     A$="SmartHeal"
  2426.   Else 
  2427.     A$="MaxHeal"
  2428.   End If 
  2429.   If FIGHT_RESPONSE(16)=150
  2430.     AA_FONT[2,16,A$]
  2431.   Else 
  2432.     AA_REVFONT[2,16,A$]
  2433.   End If 
  2434.   Cls 0,84,8 To 160,16
  2435.   Cls 7,84,8 To 84+(FIGHT_RESPONSE(16)*76)/150,16
  2436.   AA_BOX[84,8,160,16]
  2437.   
  2438.   RATING_GET["HP"] : HP=Param
  2439.   RATING_GET["MHP"] : MHP=Param
  2440.   A$="HP:"+(Str$(HP)-" ")+"/"+(Str$(MHP)-" ")
  2441.   AA_FONT[180,16,A$]
  2442.   Screen Copy Logic(1) To Physic(1) : Wait Vbl 
  2443.   Screen S
  2444. End Proc
  2445.  
  2446. Procedure FIGHT_TEXT[TXT$]
  2447.   On Error Proc INEXT_ERRORTRAP
  2448.   S=Screen : Screen 1
  2449.   FIGHT_BACKDROP
  2450.   AA_FONT[4,16,TXT$]
  2451.   Screen Copy Logic To Physic : Extension_18_0A50 VB_LINE
  2452.   Screen S
  2453. End Proc
  2454. Procedure FIGHT
  2455.   On Error Proc INEXT_ERRORTRAP
  2456.   Shared ENEMY_CURRMARK,FIGHT_CURROPTION,NOKILL,ENEMY_GROUP
  2457.   Shared _ATTACK,_DEFENSE
  2458.   FIGHT_END=False
  2459.   RATING_GET["DEX"]
  2460.   FRSPEED=Param
  2461.   
  2462.   RATING_GET["INT"]
  2463.   SMARTS=Param
  2464.   
  2465.   Proc ITEM_CALCATTACK : _ATTACK=Param
  2466.   Proc ITEM_CALCDEFENSE : _DEFENSE=Param
  2467.   CASH=0
  2468.   
  2469.   FIGHT_CURROPTION=0
  2470.   FS_POS=((CHAR_YPOS-MAP_YPOS)<100)
  2471.   
  2472.   For I=0 To 15
  2473.     HIT_PERCENT=Max(HIT_PERCENT,FIGHT_ATTACK(I)+FIGHT_DEFENSE(I))
  2474.   Next 
  2475.   HIT_PERCENT=Max(HIT_PERCENT,(_ATTACK+_DEFENSE))
  2476.   
  2477.   Do 
  2478.     If Key State(88)
  2479.       If Not FS_POS
  2480.         Screen Display 1,,226,,0
  2481.       Else 
  2482.         Screen Display 1,,50,,0
  2483.       End If 
  2484.       Repeat : Until Not Key State(88)
  2485.       FS_POS= Not FS_POS
  2486.     End If 
  2487.     If Jleft(1)
  2488.       D=ENEMY_CURRMARK
  2489.       Repeat 
  2490.         Add D,-1,0 To ENEMY_MAX
  2491.       Until FIGHT_HP(D)>0
  2492.       FIGHT_ENEMYWHICH[D]
  2493.     Else If Jright(1)
  2494.       D=ENEMY_CURRMARK
  2495.       Repeat 
  2496.         Add D,1,0 To ENEMY_MAX
  2497.       Until FIGHT_HP(D)>0
  2498.       FIGHT_ENEMYWHICH[D]
  2499.     Else If Jup(1)
  2500.       Add FIGHT_CURROPTION,-1,0 To 3
  2501.       JS_WAIT
  2502.     Else If Jdown(1)
  2503.       Add FIGHT_CURROPTION,1,0 To 3
  2504.       JS_WAIT
  2505.     Else If Fire(1) and FIGHT_RESPONSE(16)=150
  2506.       FIGHT_RESPONSE(16)=0
  2507.       If FIGHT_CURROPTION=0
  2508.         CE=ENEMY_CURRMARK
  2509.         FIGHT_ENEMYWHICH[-1]
  2510.         WB=FIGHT_ENEMIES(CE)
  2511.         DX=(X Bob(WB)-4)-CHAR_XPOS
  2512.         DY=(Y Bob(WB)+4)-CHAR_YPOS
  2513.         NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+6,False] : OSET=Param
  2514.         
  2515.         For I=1 To 10
  2516.           HEI=Sin(I*18)*20
  2517.           PX=CHAR_XPOS+(DX*I)/10
  2518.           PY=CHAR_YPOS+(DY*I)/10-HEI
  2519.           
  2520.           Bob 0,PX,PY,
  2521.           MAP_DISPLAY
  2522.         Next 
  2523.         
  2524.         HIT=_ATTACK+_DEFENSE
  2525.         If Rnd(HIT_PERCENT)<HIT
  2526.           YOUR_ATK=Rnd(0.2*_ATTACK)+(0.9*_ATTACK)
  2527.           If Rnd(10)=0
  2528.             YOUR_ATK=(YOUR_ATK*5)/4
  2529.             S=Screen : Screen 2
  2530.             For I=0 To 31
  2531.               Colour I,$FFF
  2532.             Next 
  2533.             Fade 2 To 0 : Screen S
  2534.           End If 
  2535.           
  2536.           DMG=YOUR_ATK-FIGHT_DEFENSE(CE)
  2537.           
  2538.           If DMG>0
  2539.             FIGHT_HP(CE)=FIGHT_HP(CE)-DMG
  2540.             A$=Str$(DMG)-" "
  2541.           Else 
  2542.             A=YOUR_ATK*0.1
  2543.             If A>0
  2544.               DMG=Max(1,Rnd(A))
  2545.             Else 
  2546.               DMG=1
  2547.             End If 
  2548.             FIGHT_HP(CE)=FIGHT_HP(CE)-DMG
  2549.             A$=Str$(DMG)-" "
  2550.           End If 
  2551.         Else 
  2552.           A$="Missed!"
  2553.         End If 
  2554.         
  2555.         NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+7,False]
  2556.         SOUND_PLAY["RPG:Sounds/Fight0x.iff",15,8000,236]
  2557.         Repeat 
  2558.           MAP_DISPLAY
  2559.           NEWFRAME_MOVE[0,False]
  2560.         Until Param
  2561.         MAP_DISPLAY
  2562.         Wait 5
  2563.         NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+6,False]
  2564.         
  2565.         For I=10 To 0 Step -1
  2566.           HEI=Sin(I*18)*20
  2567.           PX=CHAR_XPOS+(DX*I)/10
  2568.           PY=CHAR_YPOS+(DY*I)/10-HEI
  2569.           
  2570.           Bob 0,PX,PY,
  2571.           MAP_DISPLAY
  2572.         Next 
  2573.         
  2574.         NEWFRAME_SET[0,OSET,False]
  2575.         MAP_DISPLAY
  2576.         
  2577.         FIGHT_NUMBERBOUNCE[CE,A$]
  2578.         
  2579.         If FIGHT_HP(CE)<1
  2580.           If Not NOKILL : Bob WB,-50,-50, : End If 
  2581.           A=FIGHT_ATTACK(CE)+FIGHT_DEFENSE(CE)
  2582.           RATINGS(6)=RATINGS(6)+A
  2583.           CASH=CASH+(A*0.75)+Rnd(A*0.25)
  2584.           MAP_DISPLAY
  2585.           EDCNT=0
  2586.           Repeat 
  2587.             Add CE,1,0 To ENEMY_MAX
  2588.             If FIGHT_HP(CE)<1 : Inc EDCNT : End If 
  2589.           Until FIGHT_HP(CE)>0 or EDCNT=>ENEMY_MAX
  2590.           If EDCNT=>ENEMY_MAX
  2591.             Goto __BATTLEEND
  2592.           End If 
  2593.         End If 
  2594.         FIGHT_ENEMYWHICH[CE]
  2595.       Else 
  2596.         If FIGHT_CURROPTION=1
  2597.           MX=$FFFF
  2598.         Else 
  2599.           MX=0
  2600.         End If 
  2601.         MZ=-1
  2602.         For I=5 To 261
  2603.           If ITEMHAVE(I)>0
  2604.             If Deek(Start(60)+ITEMHAVE(I)*8+6)=4
  2605.               IHP=Deek(Start(60)+ITEMHAVE(I)*8+2)
  2606.               If FIGHT_CURROPTION=1
  2607.                 If IHP<MX
  2608.                   MX=IHP : MZ=I
  2609.                 End If 
  2610.               Else If FIGHT_CURROPTION=2
  2611.                 If IHP>MX and IHP<RATINGS(1)
  2612.                   MX=IHP : MZ=I
  2613.                 End If 
  2614.               Else If FIGHT_CURROPTION=3
  2615.                 If IHP>MX
  2616.                   MX=IHP : MZ=I
  2617.                 End If 
  2618.               End If 
  2619.             End If 
  2620.           End If 
  2621.         Next 
  2622.         If MZ>-1
  2623.           RATINGS(0)=Min(RATINGS(0)+MX,RATINGS(1))
  2624.           ITEM_REMFROMSPOT[MZ]
  2625.           ITEM_REORG
  2626.           A$="+"+(Str$(MX)-" ")
  2627.           FIGHT_NUMBERBOUNCE[-1,A$]
  2628.         Else 
  2629.           FIGHT_RESPONSE(16)=150
  2630.         End If 
  2631.       End If 
  2632.     End If 
  2633.     
  2634.     For J=0 To ENEMY_MAX
  2635.       If FIGHT_RESPONSE(J)=150 and FIGHT_HP(J)>0
  2636.         CE=ENEMY_CURRMARK
  2637.         FIGHT_ENEMYWHICH[-1]
  2638.         EB=FIGHT_ENEMIES(J)
  2639.         EX=X Bob(EB) : EY=Y Bob(EB)
  2640.         DX=(CHAR_XPOS-4)-EX
  2641.         DY=(CHAR_YPOS+4)-EY
  2642.         
  2643.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+6,False] : OSET=Param
  2644.         For I=1 To 10
  2645.           HEI=Sin(I*18)*20
  2646.           PX=EX+(DX*I)/10
  2647.           PY=EY+(DY*I)/10-HEI
  2648.           
  2649.           Bob EB,PX,PY,
  2650.           MAP_DISPLAY
  2651.         Next 
  2652.         
  2653.         HIT=FIGHT_ATTACK(J)+FIGHT_DEFENSE(J)
  2654.         
  2655.         If Rnd(HIT_PERCENT)<HIT
  2656.           HISATK=Rnd(0.2*FIGHT_ATTACK(J))+(0.9*FIGHT_ATTACK(J))
  2657.           If Rnd(10)=0
  2658.             HISATK=(HISATK*5)/4
  2659.             S=Screen : Screen 2
  2660.             For I=0 To 31 : Colour I,$FFF : Next 
  2661.             Fade 2 To 0 : Screen S
  2662.           End If 
  2663.           
  2664.           DMG=HISATK-_DEFENSE
  2665.           
  2666.           If DMG>0
  2667.             RATING_GET["HP"]
  2668.             HP=Param-DMG
  2669.             RATING_SET["HP",HP]
  2670.             A$=Str$(DMG)-" "
  2671.           Else 
  2672.             A=HISATK*0.1
  2673.             If A>0
  2674.               DMG=Max(1,Rnd(A))
  2675.             Else 
  2676.               DMG=1
  2677.             End If 
  2678.             RATING_GET["HP"]
  2679.             HP=Param-DMG
  2680.             RATING_SET["HP",HP]
  2681.             A$=Str$(DMG)-" "
  2682.           End If 
  2683.         Else 
  2684.           A$="Missed!"
  2685.           HP=69
  2686.         End If 
  2687.         
  2688.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+7,False]
  2689.         SOUND_PLAY["RPG:Sounds/fight"+(Str$(ENEMY_GROUP)-" ")+"x.iff",15,8000,236]
  2690.         Repeat 
  2691.           MAP_DISPLAY
  2692.           NEWFRAME_MOVE[EB,False]
  2693.         Until Param
  2694.         MAP_DISPLAY
  2695.         Wait 5
  2696.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+6,False]
  2697.         
  2698.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+6,False]
  2699.         
  2700.         For I=10 To 0 Step -1
  2701.           HEI=Sin(I*18)*20
  2702.           PX=EX+(DX*I)/10
  2703.           PY=EY+(DY*I)/10-HEI
  2704.           
  2705.           Bob EB,PX,PY,
  2706.           MAP_DISPLAY
  2707.         Next 
  2708.         FIGHT_RESPONSE(J)=0
  2709.         
  2710.         NEWFRAME_SET[EB,OSET,False]
  2711.         MAP_DISPLAY
  2712.         
  2713.         FIGHT_NUMBERBOUNCE[-1,A$]
  2714.         
  2715.         If HP<1
  2716.           IMDEAD=True
  2717.           Goto __BATTLEEND
  2718.         End If 
  2719.         FIGHT_ENEMYWHICH[CE]
  2720.       End If 
  2721.     Next 
  2722.     
  2723.     If RESP_UPDATE=2
  2724.       For I=0 To ENEMY_MAX
  2725.         FIGHT_RESPONSE(I)=FIGHT_RESPONSE(I)+(FIGHT_CHARGE(I)/2)+Rnd(FIGHT_CHARGE(I)/2)
  2726.         If FIGHT_RESPONSE(I)>150 : FIGHT_RESPONSE(I)=150 : End If 
  2727.       Next 
  2728.       
  2729.       FIGHT_RESPONSE(16)=FIGHT_RESPONSE(16)+(FIGHT_CHARGE(16)/2)+Rnd(FIGHT_CHARGE(16)/2)
  2730.       If FIGHT_RESPONSE(16)>150 : FIGHT_RESPONSE(16)=150 : End If 
  2731.     End If 
  2732.     Add RESP_UPDATE,1,0 To 2
  2733.     FIGHT_SCREENUPDATE
  2734.     SCRNSAVER_KILL
  2735.     SNAPSHOT
  2736.   Loop 
  2737.   
  2738.   __BATTLEEND:
  2739.   If Not IMDEAD
  2740.     Repeat : Until Joy(1)=0
  2741.     NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+4,True]
  2742.     Repeat 
  2743.       MAP_DISPLAY
  2744.       NEWFRAME_MOVE[0,True]
  2745.     Until Param
  2746.     MAP_DISPLAY
  2747.     
  2748.     FIGHT_TEXT["Earned"+Str$(CASH)+" Credits"]
  2749.     T=Timer+200
  2750.     Repeat : Until Joy(1)>0 or Timer>T
  2751.     Repeat : Until Joy(1)=0
  2752.     RATINGS(5)=RATINGS(5)+CASH
  2753.     
  2754.     Proc RATING_NEXTUP : NXTUP=Param
  2755.     If RATINGS(6)=>NXTUP
  2756.       PTS=11 : RPTS=4 : I=1
  2757.       Repeat 
  2758.         If I=1
  2759.           If Rnd(1)=0
  2760.             RATINGS(1)=RATINGS(1)+1
  2761.             PTS=PTS-1
  2762.           End If 
  2763.         Else 
  2764.           If Rnd(5)=0 and RPTS>0
  2765.             RATINGS(I)=RATINGS(I)+1
  2766.             PTS=PTS-1
  2767.             RPTS=RPTS-1
  2768.           End If 
  2769.         End If 
  2770.         Add I,1,1 To 4
  2771.       Until PTS=0
  2772.       
  2773.       FIGHT_TEXT["Level Up!! "+Str$(7+RPTS)+" HP Gained!"]
  2774.       T=Timer+200
  2775.       Repeat : Until Joy(1)>0 or Timer>T
  2776.       Repeat : Until Joy(1)=0
  2777.       
  2778.       RATINGS(6)=RATINGS(6)-NXTUP
  2779.     End If 
  2780.   Else 
  2781.     Wait 60
  2782.   End If 
  2783.   Bob Off 64
  2784.   Screen 0
  2785.   Erase 236
  2786. End Proc
  2787. Procedure FIGHT_NUMBERBOUNCE[WHICH,TXT$]
  2788.   On Error Proc INEXT_ERRORTRAP
  2789.   S=Screen : Screen 2
  2790.   If WHICH=-1
  2791.     X=X Bob(0)-MAP_XPOS
  2792.     Y=Y Bob(0)-MAP_YPOS
  2793.   Else 
  2794.     X=X Bob(FIGHT_ENEMIES(WHICH))-MAP_XPOS
  2795.     Y=Y Bob(FIGHT_ENEMIES(WHICH))-MAP_YPOS
  2796.   End If 
  2797.   
  2798.   D=8 : L=Text Length(TXT$)
  2799.   L=L/2
  2800.   Screen Copy Physic To Logic
  2801.   DX=(X-L) and $FFF8
  2802.   DY=Y-28
  2803.   If DX+(L*2)+8>312 : DX=312-((L*2)+8) : End If 
  2804.   If DX<0 : DX=0 : End If 
  2805.   If DY<0 : DY=0 : End If 
  2806.   If DY+38>199 : DY=161 : End If 
  2807.   Get Block 400,DX,DY,L*2+8,38,1
  2808.   Repeat 
  2809.     For I=D To 0 Step -1
  2810.       Ink 0 : Text X-L-1,Y-8-I,TXT$
  2811.       Text X-L+1,Y-8-I,TXT$
  2812.       Ink 31 : Text X-L,Y-8-I,TXT$
  2813.       Screen Swap : Extension_18_0A50 VB_LINE
  2814.       Put Block 400
  2815.     Next 
  2816.     D=D/2
  2817.   Until D=0
  2818.   Wait 25
  2819.   Put Block 400
  2820.   Screen Swap : Extension_18_0A50 VB_LINE
  2821.   Screen S
  2822. End Proc
  2823. Procedure FIGHT_ENEMYWHICH[WHICH]
  2824.   On Error Proc INEXT_ERRORTRAP
  2825.   Shared ENEMY_CURRMARK
  2826.   S=Screen : Screen 2
  2827.   
  2828.   MAP_DISPLAY
  2829.   
  2830.   'Screen Copy Physic To Logic 
  2831.   Autoback 1
  2832.   
  2833.   'If ENEMY_CURRMARK>-1
  2834.   '  BW=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(ENEMY_CURRMARK))))*8
  2835.   '  BH=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(ENEMY_CURRMARK)))+2)
  2836.   '  BX=X Bob(FIGHT_ENEMIES(ENEMY_CURRMARK))-MAP_XPOS
  2837.   '  BY=Y Bob(FIGHT_ENEMIES(ENEMY_CURRMARK))-MAP_YPOS
  2838.   '  'Box BX-BW,BY-BH To BX+BW,BY  
  2839.   '  ENEMY_CURRMARK=-1 
  2840.   'End If  
  2841.   If WHICH>-1
  2842.     BW=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(WHICH))))*8
  2843.     BH=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(WHICH)))+2)
  2844.     BX=X Bob(FIGHT_ENEMIES(WHICH))-MAP_XPOS
  2845.     BY=Y Bob(FIGHT_ENEMIES(WHICH))-MAP_YPOS
  2846.     DPOINTER[BX-BW-16,BY-(BH/2)-8]
  2847.     'Plot BX-BW,BY-BH
  2848.     'Box BX-BW,BY-BH To BX+BW,BY 
  2849.     ENEMY_CURRMARK=WHICH
  2850.   End If 
  2851.   
  2852.   Autoback 0
  2853.   Screen S
  2854.   
  2855. End Proc
  2856.  
  2857. Procedure JS_WAIT
  2858.   On Error Proc INEXT_ERRORTRAP
  2859.   Repeat : Until Joy(1)=0
  2860. End Proc
  2861.  
  2862. Procedure NEWFRAME_SETUP
  2863.   Shared FRAMES_MAX,PIC_POINTER
  2864.   On Error Proc INEXT_ERRORTRAP
  2865.   Reserve As Work 66,64000
  2866.   FRAME_PTR=Start(66)
  2867.   Reserve As Work 43,2048
  2868.   Reserve As Work 26,4096
  2869.   Open In 3,"frames.data"
  2870.   Set Input 10,-1
  2871.   Line Input #3,FRAMES_FILE$
  2872.   CFP=0
  2873.   Repeat 
  2874.     Line Input #3,A$
  2875.     If Not Eof(3)
  2876.       A= Extension_10_0512(A$)
  2877.       F=Val( Extension_10_0520(1,A$))
  2878.       C=Val( Extension_10_0520(2,A$))
  2879.       Doke FRAME_PTR+1024+F*2,CFP
  2880.       Q=CFP : CFP=CFP+2
  2881.       TF=-1
  2882.       For I=3 To A
  2883.         D=Val( Extension_10_0520(I,A$))
  2884.         If D>0
  2885.           Doke FRAME_PTR+9216+CFP,D
  2886.           CFP=CFP+2 : TF=TF+1
  2887.         End If 
  2888.       Next 
  2889.       Doke FRAME_PTR+9216+Q,TF
  2890.       Doke FRAME_PTR+9216+CFP,C : CFP=CFP+2
  2891.       If F>FRAMES_MAX
  2892.         FRAMES_MAX=F
  2893.       End If 
  2894.       If F=4090
  2895.         PIC_POINTER=Val( Extension_10_0520(3,A$))
  2896.       End If 
  2897.     End If 
  2898.   Until Eof(3)
  2899.   Close 3
  2900.   Amos To Front 
  2901.   Load "FrameInfo.bin",43
  2902.   'Open In 3,FRAMES_FILE$
  2903.   'CPOS=86 : EPOS=Lof(3) 
  2904.   'C=1 : N=Start(43)+4 
  2905.   'Repeat  
  2906.   '  Loke N,CPOS : N=N+4 
  2907.   '  Pof(3)=CPOS+4 
  2908.   '  CPOS=CPOS+6+Elword(Input$(3,2)) 
  2909.   '  Pof(3)=CPOS 
  2910.   'Until CPOS=>EPOS
  2911.   'Save "FrameInfo.bin",43 
  2912.   'Close 3 
  2913. End Proc
  2914. Procedure NEWFRAME_RESET
  2915.   On Error Proc INEXT_ERRORTRAP
  2916.   FRAMES_LOAD$=""
  2917. End Proc
  2918. Procedure NEWFRAME_SET[CHAR,WHICH,RV]
  2919.   'On Error Proc INEXT_ERRORTRAP 
  2920.   FP=Deek(FRAME_PTR+1024+WHICH*2)
  2921.   FM=Deek(FRAME_PTR+9216+FP)
  2922.   If Not RV
  2923.     Doke FRAME_PTR+CHAR*4,0
  2924.     CB=0
  2925.   Else 
  2926.     Doke FRAME_PTR+CHAR*4,FM
  2927.     CB=FM
  2928.   End If 
  2929.   OSET=Deek(FRAME_PTR+CHAR*4+2)
  2930.   Doke FRAME_PTR+CHAR*4+2,WHICH
  2931.   CB=Deek(FRAME_PTR+9218+FP+(CB*2))
  2932.   FRAME_NEWCHECK[CB]
  2933.   C=Deek(FRAME_PTR+9218+FP+((FM+1)*2))
  2934.   If C=2
  2935.     CB=Hrev(CB)
  2936.   Else If C=3
  2937.     CB=Vrev(CB)
  2938.   End If 
  2939.   Bob CHAR,,,CB
  2940.   'FRAME_DIDCHANGE(CHAR)=True
  2941. End Proc[OSET]
  2942. Procedure NEWFRAME_LOOP[CHAR,RV]
  2943.   On Error Proc INEXT_ERRORTRAP
  2944.   NEWFRAME_MOVE[CHAR,RV]
  2945.   If Param
  2946.     FS=Deek(FRAME_PTR+CHAR*4+2)
  2947.     NEWFRAME_SET[CHAR,FS,RV]
  2948.   End If 
  2949. End Proc
  2950. Procedure NEWFRAME_MOVE[CHAR,RV]
  2951.   On Error Proc INEXT_ERRORTRAP
  2952.   CF=Deek(FRAME_PTR+CHAR*4)
  2953.   FS=Deek(FRAME_PTR+CHAR*4+2)
  2954.   FP=Deek(FRAME_PTR+1024+FS*2)
  2955.   FM=Deek(FRAME_PTR+9216+FP)
  2956.   C=Deek(FRAME_PTR+9218+FP+((FM+1)*2))
  2957.   If RV
  2958.     If CF=0
  2959.       EF=True
  2960.     Else 
  2961.       CF=CF-1
  2962.     End If 
  2963.   Else 
  2964.     If CF=FM
  2965.       EF=True
  2966.     Else 
  2967.       CF=CF+1
  2968.     End If 
  2969.   End If 
  2970.   Doke FRAME_PTR+CHAR*4,CF
  2971.   CB=Deek(FRAME_PTR+9218+FP+(CF*2))
  2972.   FRAME_NEWCHECK[CB]
  2973.   If C=2
  2974.     CB=Hrev(CB)
  2975.   Else If C=3
  2976.     CB=Vrev(CB)
  2977.   End If 
  2978.   Bob CHAR,,,CB
  2979. End Proc[EF]
  2980. Procedure NEWFRAME_CHANGE[CHAR]
  2981.   On Error Proc INEXT_ERRORTRAP
  2982.   FS=Deek(FRAME_PTR+CHAR*4+2)
  2983.   FP=Deek(FRAME_PTR+1024+FS*2)
  2984.   FM=Deek(FRAME_PTR+9216+FP)
  2985.   C=Deek(FRAME_PTR+9218+FP+((FM+1)*2))
  2986. End Proc[C=1]
  2987. Procedure NEWFRAME_CURRFRAMESET[CHAR]
  2988.   FS=Deek(FRAME_PTR+CHAR*4+2)
  2989. End Proc[FS]
  2990. Procedure NEWFRAME_FULLREQUEST
  2991.   S=Start(43) : SNOPEN=False
  2992.   Open In 3,FRAMES_FILE$
  2993.   For J=1 To Len(FRAMES_LOAD$) Step 2
  2994.     WHICH= Extension_16_04F8(Mid$(FRAMES_LOAD$,J,2))
  2995.     FP=Deek(FRAME_PTR+1024+WHICH*2)
  2996.     FM=Deek(FRAME_PTR+9216+FP)
  2997.     For I=0 To FM
  2998.       F=Deek(FRAME_PTR+9218+FP+(I*2))
  2999.       If Peek(Start(26)+F)<>255
  3000.         If SNOPEN=False
  3001.           T=Screen
  3002.           Screen Open 6,320,200,64,Lowres
  3003.           Screen Hide 6
  3004.           SNOPEN=True
  3005.         End If 
  3006.         A=Leek(S+F*4)
  3007.         If A>0
  3008.           POS=Leek(Start(43)+F*4)
  3009.           Pof(3)=POS
  3010.           SW= Extension_16_04F8(Input$(3,2))
  3011.           SH= Extension_16_04F8(Input$(3,2))
  3012.           SS= Extension_16_04F8(Input$(3,2))
  3013.           Reserve As Work 12,SS
  3014.           Sload 3 To 12,SS
  3015.           Unpack 12,0,0
  3016.           Erase 12
  3017.           'Unpack A+6,0,0
  3018.           Get Bob F,0,0 To SW,SH
  3019.           Hot Spot F,$12
  3020.           Poke Start(26)+F,255
  3021.         End If 
  3022.       End If 
  3023.       Poke Start(25)+F,255
  3024.     Next 
  3025.   Next 
  3026.   Close 3
  3027.   If SNOPEN
  3028.     Screen Close 6
  3029.     Screen T
  3030.   End If 
  3031. End Proc
  3032. Procedure NEWFRAME_GRABSET[WHICH]
  3033.   On Error Proc INEXT_ERRORTRAP
  3034.   FRAMES_LOAD$=FRAMES_LOAD$+ Extension_16_04EA(WHICH)
  3035. End Proc
  3036. Procedure FRAMES_CHECKSETUP
  3037.   On Error Proc INEXT_ERRORTRAP
  3038.   Reserve As Work 25,4096
  3039. End Proc
  3040. Procedure FRAME_NEWCHECK[F]
  3041.   On Error Proc INEXT_ERRORTRAP
  3042.   If Peek(Start(26)+F)<>255
  3043.     A=Leek(Start(43)+F*4)
  3044.     If A>0
  3045.       T=Screen
  3046.       Screen Open 6,320,200,64,Lowres
  3047.       Screen Hide 6
  3048.       Open In 3,FRAMES_FILE$
  3049.       POS=Leek(Start(43)+F*4)
  3050.       D=(D+5) mod 191
  3051.       Pof(3)=POS
  3052.       SW= Extension_16_04F8(Input$(3,2))
  3053.       SH= Extension_16_04F8(Input$(3,2))
  3054.       SS= Extension_16_04F8(Input$(3,2))
  3055.       Reserve As Work 12,SS
  3056.       Sload 3 To 12,SS
  3057.       Close 3
  3058.       Unpack 12,0,0
  3059.       Erase 12
  3060.       'Unpack A+6,0,0
  3061.       Get Bob F,0,0 To SW,SH
  3062.       Hot Spot F,$12
  3063.       Poke Start(26)+F,255
  3064.       Screen Close 6
  3065.       Screen T
  3066.     End If 
  3067.   End If 
  3068.   Poke Start(25)+F,255
  3069. End Proc
  3070. Procedure FRAMES_HOUSEKEEPING
  3071.   On Error Proc INEXT_ERRORTRAP
  3072.   S=Start(25)
  3073.   For I=1 To 4095
  3074.     If Peek(S+I)=0
  3075.       If Peek(Start(26)+I)=255
  3076.         Del Bob I : Ins Bob I
  3077.         Poke Start(26)+I,0
  3078.       End If 
  3079.     End If 
  3080.   Next 
  3081. End Proc
  3082.  
  3083. Procedure DPOINTER[X,Y]
  3084.   Shared PIC_POINTER
  3085.   Paste Bob X,Y,PIC_POINTER
  3086. End Proc
  3087.  
  3088. Procedure LEVEL_CHECK
  3089.   On Error Proc INEXT_ERRORTRAP
  3090.   If LEVEL_LOADNOW$<>""
  3091.     MAP_FRONTCLOSE
  3092.     LEVEL_LOAD[LEVEL_LOADNOW$]
  3093.     LEVEL_LOADNOW$=""
  3094.   End If 
  3095. End Proc
  3096. Procedure LEVEL_LOAD[FILE$]
  3097.   On Error Proc INEXT_ERRORTRAP
  3098.   Shared MUS_NOPLAY,PIC_POINTER
  3099.   
  3100.   Open In 4,"levels/"+FILE$
  3101.   Set Input 10,-1
  3102.   Bob Off 
  3103.   If EFFECT_SETTINGS(0)>0
  3104.     Trap Del Block 200
  3105.   End If 
  3106.   EFFECT_SETTINGS(0)=0
  3107.   CONTROLLOCK=False
  3108.   WALKTHRUWALLS=False
  3109.   SCRIPT_PREP
  3110.   MAP_ZONERESET
  3111.   FRAMES_CHECKSETUP
  3112.   NEWFRAME_RESET
  3113.   BLACKSCREEN=True
  3114.   CZ=0 : MP$=""
  3115.   
  3116.   Repeat 
  3117.     Line Input #4,A$
  3118.     B$=A$-" "
  3119.     If B$<>""
  3120.       If B$="|MAPZ|"
  3121.         MD=0
  3122.       Else If B$="|CHARZ|"
  3123.         MD=1
  3124.       Else If B$="|ZONEZ|"
  3125.         MD=2
  3126.       Else If B$="|COMMENTZ|"
  3127.         MD=3
  3128.       Else If B$="|EFFECTZ|"
  3129.         MD=4
  3130.       Else If B$="|MUSIL|"
  3131.         MD=5
  3132.       Else If B$="|NAMEZ|"
  3133.         MD=6
  3134.       Else If B$="|DELAYZ|"
  3135.         NOFRONTFADE=True
  3136.       Else 
  3137.         If MD=0
  3138.           MP$= Extension_18_006A(A$)
  3139.         Else If MD=1
  3140.           SC$="scripts/"+ Extension_10_0520(1,A$)
  3141.           X=Val( Extension_10_0520(2,A$))
  3142.           Y=Val( Extension_10_0520(3,A$))
  3143.           F=Val( Extension_10_0520(4,A$))
  3144.           V=Val( Extension_10_0520(5,A$))
  3145.           S=Val( Extension_10_0520(6,A$))
  3146.           'FRAMES_CHECK[F] 
  3147.           CHAR_SET[SC$,X,Y,F,V,S]
  3148.         Else If MD=2
  3149.           A= Extension_10_0512(A$)
  3150.           TP$=Upper$( Extension_10_0520(1,A$))
  3151.           If TP$="STOP"
  3152.             T=0
  3153.           Else If TP$="SLOW"
  3154.             T=1
  3155.           Else If TP$="LEVEL"
  3156.             T=2
  3157.           Else If TP$="FIGHT"
  3158.             T=3
  3159.           Else If TP$="LABELJUMP"
  3160.             T=4
  3161.           End If 
  3162.           X1=Val( Extension_10_0520(2,A$))
  3163.           Y1=Val( Extension_10_0520(3,A$))
  3164.           X2=Val( Extension_10_0520(4,A$))
  3165.           Y2=Val( Extension_10_0520(5,A$))
  3166.           MAP_ZONESET[CZ,X1,Y1,X2,Y2,T]
  3167.           If A>5
  3168.             If A>9 : A=9 : End If 
  3169.             For I=6 To A
  3170.               MAP_ZONESETVAR[CZ,I-6,Val( Extension_10_0520(I,A$))]
  3171.             Next 
  3172.           End If 
  3173.           Inc CZ
  3174.         Else If MD=4
  3175.           A= Extension_10_0512(A$)-1
  3176.           If A>-1
  3177.             For I=0 To A
  3178.               EFFECT_SETTINGS(I)=Val( Extension_10_0520(I+1,A$))
  3179.             Next 
  3180.           End If 
  3181.         Else If MD=5
  3182.           If A$<>""
  3183.             A$="mods/"+A$
  3184.             If Exist(A$)=True
  3185.               NEWMOD$=Upper$(A$)
  3186.             Else 
  3187.               INEXT_ERROR["Cannot Find .mod File","",A$]
  3188.             End If 
  3189.           End If 
  3190.         Else If MD=6
  3191.           CHAR_NAME$= Extension_18_006A(A$)
  3192.         End If 
  3193.         
  3194.       End If 
  3195.       If MD<>0 and MP$<>""
  3196.         MAP_SCREENLOAD["maps/"+MP$] : MP$=""
  3197.       End If 
  3198.     End If 
  3199.   Until Eof(4)
  3200.   Close 4
  3201.   
  3202.   NEWFRAME_FULLREQUEST
  3203.   
  3204.   If Exist("scripts/globalscript.script")
  3205.     CHAR_SET["scripts/globalscript.script",-49,-49,0,0,0]
  3206.   End If 
  3207.   
  3208.   If Not MUS_NOPLAY
  3209.     If NEWMOD$<>CURRMOD$
  3210.       For I=63 To 0 Step -4
  3211.          Extension_15_03B0 I : Wait Vbl 
  3212.       Next 
  3213.        Extension_15_0376 : Erase 33
  3214.       If NEWMOD$<>""
  3215.         If Not Exist("RPG:"+NEWMOD$)
  3216.           INEXT_ERROR["Unable to find MOD File",NEWMOD$,"In Mods Directory"]
  3217.         End If 
  3218.          Extension_15_039E "RPG:"+NEWMOD$,33 : Extension_15_03B0 63
  3219.          Extension_15_0384 33
  3220.       End If 
  3221.       CURRMOD$=NEWMOD$
  3222.     End If 
  3223.   End If 
  3224.   
  3225.   If LEVEL_SKIPCHARXY
  3226.     Bob 0,CHAR_XPOS,CHAR_YPOS,
  3227.   Else 
  3228.     CHAR_XPOS=X Bob(0) : CHAR_YPOS=Y Bob(0)
  3229.   End If 
  3230.   LEVEL_SKIPCHARXY=False
  3231.   EFFECT_SETUP
  3232.   CLR_SETUP
  3233.   
  3234.   FRAME_NEWCHECK[PIC_POINTER]
  3235.   FRAMES_HOUSEKEEPING
  3236.   
  3237.   CURRLEVEL$=FILE$
  3238.   
  3239.   DISPLAY_SHOW=True
  3240.   If Not NOFRONTFADE
  3241.     MAP_FRONTFADEIN
  3242.   End If 
  3243.   NOFRONTFADE=False
  3244. End Proc
  3245.  
  3246. Procedure SCRNSAVER
  3247.   On Error Proc INEXT_ERRORTRAP
  3248.   If SSVTIMER=0
  3249.     SSVTIMER=Timer+9000
  3250.   Else 
  3251.     If Joy(1)>0
  3252.       SSVTIMER=Timer+9000
  3253.     Else 
  3254.       If Timer>SSVTIMER
  3255.         BLUEUP=True : GREENUP=True : REDUP=True
  3256.         SC=-1
  3257.         Repeat 
  3258.           Inc SC
  3259.           Trap Screen SC
  3260.         Until Errtrap>0 or SC=8
  3261.         If SC<8
  3262.           S=Screen
  3263.           SW=320 : SH=200 : RES=Lowres
  3264.           Screen Open SC,SW,SH,2,RES : Flash Off : Curs Off : Cls 0
  3265.           Palette $0,$333
  3266.           
  3267.           Reserve As Work 256,176
  3268.           For I=0 To 3
  3269.             Repeat 
  3270.               DX=32757+Rnd(20)
  3271.               DY=32757+Rnd(20)
  3272.             Until DX<>32767 and DY<>32767
  3273.             Doke Start(256)+(I*4),DX
  3274.             Doke Start(256)+(I*4)+2,DX
  3275.             SX=Rnd(SW-1) : SY=Rnd(SH-1)
  3276.             For J=0 To 9
  3277.               Doke Start(256)+16+(J*8)+(I*4),SX
  3278.               Doke Start(256)+18+(J*8)+(I*4),SY
  3279.             Next 
  3280.           Next 
  3281.           
  3282.           Repeat 
  3283.             For J=0 To 1
  3284.               Ink 1-J
  3285.               For I=0 To 3
  3286.                 SX=Deek(Start(256)+16+(J*144)+I*4)
  3287.                 SY=Deek(Start(256)+18+(J*144)+I*4)
  3288.                 If I=0
  3289.                   Gr Locate SX,SY
  3290.                   OSX=SX : OSY=SY
  3291.                 Else 
  3292.                   Draw To SX,SY
  3293.                 End If 
  3294.               Next 
  3295.               Draw To OSX,OSY
  3296.             Next 
  3297.             
  3298.             Copy Start(256)+16,Start(256)+160 To Start(256)+32
  3299.             
  3300.             For I=0 To 3
  3301.               SX=Deek(Start(256)+32+I*4)
  3302.               SY=Deek(Start(256)+34+I*4)
  3303.               DX=Deek(Start(256)+I*4)-32767
  3304.               DY=Deek(Start(256)+2+I*4)-32767
  3305.               SX=SX+DX : SY=SY+DY
  3306.               CHDIR=False
  3307.               If SX<1
  3308.                 SX=1 : CHDIR=True
  3309.               Else If SX>SW-2
  3310.                 SX=SW-2 : CHDIR=True
  3311.               End If 
  3312.               If SY<1
  3313.                 SY=1 : CHDIR=True
  3314.               Else If SY>SH-2
  3315.                 SY=SH-2 : CHDIR=True
  3316.               End If 
  3317.               
  3318.               Doke Start(256)+16+I*4,SX
  3319.               Doke Start(256)+18+I*4,SY
  3320.               
  3321.               If CHDIR
  3322.                 Repeat 
  3323.                   DX=32757+Rnd(20)
  3324.                   DY=32757+Rnd(20)
  3325.                 Until DX<>32767 and DY<>32767
  3326.                 Doke Start(256)+I*4,DX
  3327.                 Doke Start(256)+2+I*4,DY
  3328.               End If 
  3329.             Next 
  3330.             
  3331.             C=Colour(1)
  3332.             R=(C and $F00)/256
  3333.             G=(C and $F0)/16
  3334.             B=C and $F
  3335.             If BLUEUP
  3336.               B=B+1
  3337.             Else 
  3338.               B=B-1
  3339.             End If 
  3340.             If B=15 or B=3
  3341.               BLUEUP= Not BLUEUP
  3342.               If GREENUP
  3343.                 G=G+1
  3344.               Else 
  3345.                 G=G-1
  3346.               End If 
  3347.               If G=15 or G=3
  3348.                 GREENUP= Not GREENUP
  3349.                 If REDUP
  3350.                   R=R+1
  3351.                 Else 
  3352.                   R=R-1
  3353.                 End If 
  3354.                 If R=15 or R=3
  3355.                   REDUP= Not REDUP
  3356.                 End If 
  3357.               End If 
  3358.             End If 
  3359.             
  3360.             C=R*256+G*16+B
  3361.             Colour 1,C
  3362.              Extension_18_0A50 VB_LINE
  3363.           Until Joy(1)<>0 or Inkey$<>""
  3364.           SSVTIMER=Timer+9000
  3365.           Screen Close SC
  3366.           Screen S
  3367.         End If 
  3368.       End If 
  3369.     End If 
  3370.   End If 
  3371. End Proc
  3372. Procedure SCRNSAVER_KILL
  3373.   SSVTIMER=Timer+9000
  3374. End Proc
  3375. Procedure XPK_BANKUNPACK[FILE$,BANK]
  3376.   On Error Proc INEXT_ERRORTRAP
  3377.   If Instr(FILE$,":")=0
  3378.     FILE$=Dir$+FILE$
  3379.   End If 
  3380.   XPK_USERBASE=$80005850
  3381.   XPK_UNPACK=-48
  3382.   XPK_EXAMINE=-36
  3383.   XPK_INNAME=XPK_USERBASE+$1
  3384.   XPK_OUTBUF=XPK_USERBASE+$12
  3385.   XPK_OUTBUFLEN=XPK_USERBASE+$21
  3386.   
  3387.   For I=12 To 400
  3388.     If Length(I)=0 and I<>BANK
  3389.       B=I : I=400
  3390.     End If 
  3391.   Next 
  3392.   Reserve As Work B,256
  3393.   
  3394.   FILE$=FILE$+Chr$(0)
  3395.   
  3396.   Lib Open 1,"xpkmaster.library",0
  3397.   CNT=0
  3398.   Repeat 
  3399.     A$= Extension_16_04CE(XPK_INNAME)+ Extension_16_04CE(Varptr(FILE$))
  3400.     A$=A$+String$(Chr$(0),9)
  3401.     Areg(0)=Start(B) : Areg(1)=Varptr(A$)
  3402.     A=Lib Call(1,XPK_EXAMINE)
  3403.     CNT=CNT+1
  3404.     'Print A 
  3405.   Until A=0 or CNT=20
  3406.   If CNT=20
  3407.     INEXT_ERROR["","XPK Unpacking Error",""]
  3408.   End If 
  3409.   OSIZE=Leek(Start(B)+4)
  3410.   
  3411.   CNT=0
  3412.   Repeat 
  3413.     Erase BANK : Reserve As Work BANK,OSIZE+256
  3414.     A$= Extension_16_04CE(XPK_INNAME)+ Extension_16_04CE(Varptr(FILE$))
  3415.     A$=A$+ Extension_16_04CE(XPK_OUTBUF)+ Extension_16_04CE(Start(BANK)-12)
  3416.     A$=A$+ Extension_16_04CE(XPK_OUTBUFLEN)+ Extension_16_04CE(OSIZE+268)
  3417.     A$=A$+String$(Chr$(0),9)
  3418.     
  3419.     Areg(0)=Varptr(A$)
  3420.     A=Lib Call(1,XPK_UNPACK)
  3421.     CNT=CNT+1
  3422.   Until A=0 or CNT=20
  3423.   If CNT=20
  3424.     INEXT_ERROR["","XPK Unpacking Error",""]
  3425.   End If 
  3426.   
  3427.   Bank Shrink BANK To OSIZE-12
  3428.   Lib Close 1
  3429. End Proc
  3430.  
  3431. Procedure SOUND_PLAY[FILE$,VOC,FREQ,BANK]
  3432.   On Error Proc INEXT_ERRORTRAP
  3433.   If Exist(FILE$)
  3434.     Open In 6,FILE$
  3435.     Erase BANK
  3436.     Reserve As Chip Work BANK,Lof(6)
  3437.     Sload 6 To BANK,Lof(6)
  3438.     Close 6
  3439.      Extension_15_0E3A VOC,Start(BANK)+72,Length(BANK)-72,FREQ
  3440.     Repeat : Until Sam Swapped(0)<>0
  3441.   End If 
  3442. End Proc
  3443.  
  3444. Procedure GAME_SAVE[FILENAME$]
  3445.   On Error Proc INEXT_ERRORTRAP
  3446.   If FILENAME$<>""
  3447.     If Upper$(Right$(FILENAME$,5))<>".GAME"
  3448.       FILENAME$=FILENAME$+".game"
  3449.     End If 
  3450.     Open Out 4,FILENAME$
  3451.     Print #4,"RPGSAVE!";Chr$(10);
  3452.     
  3453.     'Char & Map Positions
  3454.     Print #4,CURRLEVEL$;Chr$(10);
  3455.     Print #4, Extension_16_04CE(CHAR_XPOS); Extension_16_04CE(CHAR_YPOS);
  3456.     Print #4, Extension_16_04CE(MAP_XPOS); Extension_16_04CE(MAP_YPOS);
  3457.     Print #4, Extension_16_04CE(CONTROLLOCK); Extension_16_04CE(WALKTHRUWALLS);
  3458.     
  3459.     'Global Variables
  3460.     For I=0 To 255
  3461.       Print #4, Extension_16_04CE(Leek(Start(58)+(I*4)));
  3462.     Next 
  3463.     
  3464.     'Enemy Positions, Script Positions, Variables
  3465.     Print #4, Extension_16_04CE(SCR_MAX);
  3466.     
  3467.     For I=0 To SCR_MAX
  3468.       Print #4, Extension_16_04CE(X Bob(I)); Extension_16_04CE(Y Bob(I));
  3469.       Print #4, Extension_16_04CE(Leek(Start(67)+(I*12)+8));
  3470.       For J=0 To 63
  3471.         Print #4, Extension_16_04CE(Leek(Start(68)+(I*256)+(J*4)));
  3472.       Next 
  3473.       For J=0 To 3
  3474.         Print #4, Extension_16_04CE(SCRIPT_CURRCOMMAND(I,J));
  3475.       Next 
  3476.     Next 
  3477.     
  3478.     'Ratings & Items 
  3479.     For I=0 To 6
  3480.       Print #4, Extension_16_04CE(RATINGS(I));
  3481.     Next 
  3482.     
  3483.     MZ=-1
  3484.     For I=0 To 261
  3485.       If ITEMHAVE(I)>0 : MZ=I : End If 
  3486.     Next 
  3487.     Print #4, Extension_16_04CE(MZ);
  3488.     For I=0 To MZ
  3489.       Print #4, Extension_16_04CE(ITEMHAVE(I));
  3490.     Next 
  3491.     Close 4
  3492.   End If 
  3493. End Proc
  3494. Procedure GAME_LOAD[FILENAME$]
  3495.   On Error Proc INEXT_ERRORTRAP
  3496.   If FILENAME$<>"" : If Exist(FILENAME$)
  3497.       NOFRONTFADE=True
  3498.       Open In 5,FILENAME$
  3499.       Set Input 10,-1
  3500.       Line Input #5,A$
  3501.       If A$="RPGSAVE!"
  3502.         
  3503.         'Char & Map Positions
  3504.         Line Input #5,CURRLEVEL$
  3505.         LEVEL_LOADNOW$=CURRLEVEL$
  3506.         LEVEL_CHECK
  3507.         
  3508.         CHAR_XPOS= Extension_16_04DC(Input$(5,4))
  3509.         CHAR_YPOS= Extension_16_04DC(Input$(5,4))
  3510.         MAP_XPOS= Extension_16_04DC(Input$(5,4))
  3511.         MAP_YPOS= Extension_16_04DC(Input$(5,4))
  3512.         CONTROLLOCK= Extension_16_04DC(Input$(5,4))
  3513.         WALKTHRUWALLS= Extension_16_04DC(Input$(5,4))
  3514.         
  3515.         'Global Variables
  3516.         For I=0 To 255
  3517.           Loke(Start(58)+(I*4)), Extension_16_04DC(Input$(5,4))
  3518.         Next 
  3519.         
  3520.         'Enemy Positions, Script Positions, Variables
  3521.         SCR_MAX= Extension_16_04DC(Input$(5,4))
  3522.         
  3523.         For I=0 To SCR_MAX
  3524.           X= Extension_16_04DC(Input$(5,4)) : Y= Extension_16_04DC(Input$(5,4)) : Bob I,X,Y,
  3525.           Loke Start(67)+(I*12)+8, Extension_16_04DC(Input$(5,4))
  3526.           For J=0 To 63
  3527.             Loke Start(68)+(I*256)+(J*4), Extension_16_04DC(Input$(5,4))
  3528.           Next 
  3529.           For J=0 To 3
  3530.             SCRIPT_CURRCOMMAND(I,J)= Extension_16_04DC(Input$(5,4))
  3531.           Next 
  3532.         Next 
  3533.         
  3534.         'Ratings & Items 
  3535.         For I=0 To 6
  3536.           RATINGS(I)= Extension_16_04DC(Input$(5,4))
  3537.         Next 
  3538.         
  3539.         For I=0 To 255
  3540.           ITEMHAVE(I)=0
  3541.         Next 
  3542.         MZ= Extension_16_04DC(Input$(5,4))
  3543.         For I=0 To MZ
  3544.           ITEMHAVE(I)= Extension_16_04DC(Input$(5,4))
  3545.         Next 
  3546.         MAP_FRONTFADEIN
  3547.       End If 
  3548.       Close 5
  3549.   End If : End If 
  3550. End Proc
  3551.  
  3552. Procedure INEXT_ERRORTRAP
  3553.   'Error Errn
  3554.   A$=Resource$(-(5001+Errn))
  3555.   INEXT_ERROR["Internal Error","",A$]
  3556. End Proc
  3557. Procedure INEXT_ERROR[L1$,L2$,L3$]
  3558.   Shared ERR_FILE$
  3559.   Erase All 
  3560.   Amos To Back 
  3561.   Amos Lock 
  3562.   Load ERR_FILE$
  3563.    Extension_24_02DE 
  3564.    Extension_24_0018 0,1,20
  3565.   'Gui Paste Bob 1,4,20
  3566.    Extension_24_009E 0,1,0,Varptr(L1$)
  3567.    Extension_24_009E 0,2,0,Varptr(L2$)
  3568.    Extension_24_009E 0,3,0,Varptr(L3$)
  3569.   T=Timer+200
  3570.   Repeat 
  3571.     A= Extension_24_0484 
  3572.      Extension_24_02F6 
  3573.   Until Timer>T or A=-1 or A=4
  3574.   A= Extension_24_0042(0)
  3575.   Erase All 
  3576.   Amos Unlock 
  3577.   End 
  3578. End Proc
  3579.  
  3580. Procedure FULLINTRO
  3581.   Hide 
  3582.   _INTRO
  3583.   T=Timer+200
  3584.   Repeat : Until Fire(1) or Timer>T
  3585.   _INTRO_CLOSE
  3586.   _MAINMENU
  3587.   C=Param
  3588. End Proc[C]
  3589. Procedure _INTRO
  3590.   Load "MainMenu_1.spk",512
  3591.   Load "MainMenu_2.spk",513
  3592.   Unpack 512 To 6 : Screen Hide 6 : Erase 512
  3593.   Screen Open 7,320,200,4096,Lowres : Flash Off : Curs Off : Cls 0
  3594.   Get Palette 6
  3595.   For I=0 To 99
  3596.     Screen Copy 6,0,I*2,320,(I*2)+1 To 7,0,I*2
  3597.     Screen Copy 6,0,199-(I*2),320,200-(I*2) To 7,0,199-(I*2)
  3598.     If(I and 3)=0 : Wait Vbl : End If 
  3599.   Next 
  3600.   Screen Close 6
  3601. End Proc
  3602. Procedure _INTRO_CLOSE
  3603.   Screen 7
  3604.   For I=0 To 99
  3605.     Cls 0,0,I*2 To 320,(I*2)+1
  3606.     Cls 0,0,199-(I*2) To 320,200-(I*2)
  3607.     If(I and 3)=0 : Wait Vbl : End If 
  3608.   Next 
  3609.   Screen Close 7
  3610. End Proc
  3611. Procedure _MAINMENU
  3612.   Dim BCOORDS(3,3)
  3613.   For X=0 To 3
  3614.     For Y=0 To 3
  3615.       Read BCOORDS(X,Y)
  3616.     Next 
  3617.   Next 
  3618.   Unpack 513 To 6 : Screen Hide 6 : Erase 513
  3619.   Screen Open 7,320,200,16,Lowres : Flash Off : Curs Off : Cls 0
  3620.   Screen To Front 7
  3621.   For I=0 To 15 : Colour I,0 : Next 
  3622.   Screen Copy 6 To 7
  3623.   Fade 2 To 6 : Screen Close 6
  3624.   Wait 30
  3625.   CSEL=0
  3626.   Repeat 
  3627.     Ink 1
  3628.     For I=0 To 3
  3629.       Box BCOORDS(I,0),BCOORDS(I,1) To BCOORDS(I,2),BCOORDS(I,3)
  3630.     Next 
  3631.     Ink 13 : Box BCOORDS(CSEL,0),BCOORDS(CSEL,1) To BCOORDS(CSEL,2),BCOORDS(CSEL,3)
  3632.     Repeat : A=Joy(1) : Until A<>0
  3633.     If Btst(0,A)
  3634.       Add CSEL,-1,0 To 3
  3635.     Else If Btst(1,A)
  3636.       Add CSEL,1,0 To 3
  3637.     End If 
  3638.     Repeat : Until Joy(1)=0
  3639.   Until Btst(4,A)
  3640.   Fade 2 : Wait 30
  3641.   '
  3642.   Data 98,75,211,87
  3643.   Data 98,87,211,100
  3644.   Data 98,100,211,113
  3645.   Data 98,113,211,125
  3646.   '
  3647.   Screen Close 7
  3648. End Proc[CSEL]
  3649.  
  3650. Procedure FMV[FILE$]
  3651.   Open In 1,FILE$
  3652.   A=Frame Load(1 To 50)
  3653.   A=Frame Play(50,1,4)
  3654.   Double Buffer : Autoback 0
  3655.   Pof(1)=0
  3656.   L=Lof(1)
  3657.   Reserve As Work 50,60000
  3658.   FRAME=0
  3659.   Repeat 
  3660.     T=Timer+3
  3661.     A=Frame Play(Start(50),Frame Load(1 To Start(50)))
  3662.     Screen Swap : Wait Vbl 
  3663.     FRAME=FRAME+1
  3664.     Repeat : Until Timer>T
  3665.   Until FRAME=450 or Fire(1)
  3666.   Screen Close 4
  3667.   Erase 50
  3668.   Close 1
  3669. End Proc
  3670.  
  3671. Procedure CREDITS[WHICH]
  3672.   If WHICH=0
  3673.     A$="Credits_1.spk"
  3674.   Else If WHICH=1
  3675.     A$="Credits_2.spk"
  3676.   Else If WHICH=2
  3677.     A$="Credits_Demo.spk"
  3678.   End If 
  3679.   
  3680.   Wait 30
  3681.  
  3682.   Load A$,512
  3683.   Unpack 512 To 6 : Screen Hide 6
  3684.   Screen Open 7,320,200,4096,Lowres : Flash Off : Curs Off : Cls 0
  3685.   Get Palette 6
  3686.   For I=0 To 99
  3687.     Screen Copy 6,0,I*2,320,(I*2)+1 To 7,0,I*2
  3688.     Screen Copy 6,0,199-(I*2),320,200-(I*2) To 7,0,199-(I*2)
  3689.     If(I and 2)=0 : Wait Vbl : End If 
  3690.   Next 
  3691.   Screen Close 6
  3692.   T=Timer+200
  3693.   Repeat : Until Timer>T or Fire(1)
  3694.   Screen 7
  3695.   For I=0 To 99
  3696.     Cls 0,0,I*2 To 320,(I*2)+1
  3697.     Cls 0,0,199-(I*2) To 320,200-(I*2)
  3698.     If(I and 2)=0 : Wait Vbl : End If 
  3699.   Next 
  3700.   Screen Close 7
  3701.   
  3702.   Wait 30
  3703.  
  3704.   If WHICH<>2
  3705.     'scroll text up
  3706.     Screen Open 4,320,216,4,Lowres : Flash Off : Curs Off : Cls 0
  3707.     Screen Display 4,128,50,320,200
  3708.     Double Buffer : Autoback 0
  3709.     Palette $0,$333,$666,$FFF
  3710.     FONT_FIND["XEN.font/8"]
  3711.     Set Font Param
  3712.     For I=0 To 3
  3713.       MENU_COLORS(I)=I
  3714.     Next 
  3715.     Gr Writing 0
  3716.     
  3717.     NOREAD=False : NRCOUNT=24
  3718.     Def Scroll 1,0,0 To 320,216,0,-1
  3719.     Repeat 
  3720.       If NOREAD=False
  3721.         Read A$
  3722.       Else 
  3723.         NRCOUNT=NRCOUNT-1
  3724.       End If 
  3725.       If A$="!" : A$="" : NOREAD=True : End If 
  3726.  
  3727.       CNTR=160-(Text Length(A$)/2)
  3728.       AA_FONT[CNTR,209,A$]
  3729.       For I=7 To 0 Step -1
  3730.         Screen Swap : Wait 4
  3731.         Screen Copy Physic To Logic
  3732.         Scroll 1
  3733.       Next 
  3734.     Until NRCOUNT=0
  3735.   End If 
  3736.  
  3737.   Wait 30
  3738.   
  3739.   Data "Final Existence"
  3740.   Data ""
  3741.   Data "INextSoft's First Full Role Playing Game"
  3742.   Data "","",""
  3743.   Data "Programmed By","","John Bintz"
  3744.   Data "",""
  3745.   Data "Graphics By","","John Bintz"
  3746.   Data "",""
  3747.   Data "Music From","","The AMOS PD CD"
  3748.   Data "",""
  3749.   Data "Beta Testing By",""
  3750.   Data "John Bintz"
  3751.   Data "Jeremy Templeton"
  3752.   Data "Alex Fazenbaker"
  3753.   Data "Justin Bintz"
  3754.   Data "",""
  3755.   Data "Written in Amos Professional V2.0"
  3756.   Data "",""
  3757.   Data "Internext Software EMail Address"
  3758.   Data ""
  3759.   Data "uv334@victoria.tc.ca"
  3760.   Data "",""
  3761.   Data "Thanks To"
  3762.   Data ""
  3763.   Data "Becky Trout"
  3764.   Data "The Fazenbakers"
  3765.   Data "The Amos Mailing List"
  3766.   Data "Won Novalis"
  3767.   Data "Dragonfire Internet Services"
  3768.   Data "Fran�ois Lionet and Mandarin Software"
  3769.   Data "Pietro Ghizzoni"
  3770.   Data "","","","","","","","","",""
  3771.   Data "Internext Software Will Return"
  3772.   Data "In 1999"
  3773.   Data ""
  3774.   Data "!"
  3775. End Proc
  3776.  
  3777. 'i own everything, for I am Bill Gates, ruler of the Internet.